diff --git a/.github/workflows/compile.yml b/.github/workflows/compile.yml index 603c9983..b790e026 100644 --- a/.github/workflows/compile.yml +++ b/.github/workflows/compile.yml @@ -25,7 +25,7 @@ jobs: - name: install node uses: actions/setup-node@v1 with: - node-version: 15 + node-version: 18 # Runs a set of commands using the runners shell - name: npm install diff --git a/.github/workflows/linter.yml b/.github/workflows/linter.yml index 44d3b2b5..564052b7 100644 --- a/.github/workflows/linter.yml +++ b/.github/workflows/linter.yml @@ -25,7 +25,7 @@ jobs: - name: install node uses: actions/setup-node@v1 with: - node-version: 15 + node-version: 18 # Runs a set of commands using the runners shell - name: npm install diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 73f4d037..53cad6eb 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -32,7 +32,7 @@ jobs: - name: Install node uses: actions/setup-node@v1 with: - node-version: 15 + node-version: 18 - name: Install dependencies run: npm install diff --git a/.gitignore b/.gitignore index f250fae1..9a3e1288 100644 --- a/.gitignore +++ b/.gitignore @@ -13,3 +13,5 @@ logs/ yarn-error.log .vscode +# local files +sre.md diff --git a/package-lock.json b/package-lock.json index 74fe8845..a22b7fd1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,6 +9,7 @@ "version": "5.8.0", "license": "MIT", "dependencies": { + "@eth-optimism/sdk": "~3.1.8", "@influxdata/influxdb-client": "^1.14.0", "@influxdata/influxdb-client-apis": "^1.14.0", "@project-serum/anchor": "~0.23.0", @@ -24,6 +25,7 @@ "crypto-random-string": "~3.3.0", "date-fns": "^2.22.1", "dotenv": "~8.2.0", + "ethereum-input-data-decoder": "~0.4.2", "ethers": "~5.5.1", "express": "~4.17.1", "express-async-errors": "^3.1.1", @@ -97,150 +99,1527 @@ "version": "7.12.11", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", + "dependencies": { + "@babel/highlight": "^7.10.4" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", + "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.16.10", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.10.tgz", + "integrity": "sha512-5FnTQLSLswEj6IkgVw5KusNUUFY9ZGqe/TRFnP/BKYHYgfh7tc+C7mwiy95/yNP7Dh9x580Vv8r7u7ZfTBFxdw==", + "dependencies": { + "@babel/helper-validator-identifier": "^7.16.7", + "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==", + "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==", + "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==", + "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": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + }, + "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": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.17.8", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.17.8.tgz", + "integrity": "sha512-dQpEpK0O9o6lj6oPu0gRDbbnk+4LeHlNcBpspf6Olzt3GIX4P1lWF1gS+pHLDFlaJvbR6q7jCfQ08zA4QJBnmA==", + "dependencies": { + "regenerator-runtime": "^0.13.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/runtime/node_modules/regenerator-runtime": { + "version": "0.13.9", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", + "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==" + }, + "node_modules/@dabh/diagnostics": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.2.tgz", + "integrity": "sha512-+A1YivoVDNNVCdfozHSR8v/jyuuLTMXwjWuxPFlFlUapXoGc+Gj9mDlTDDfrwl7rXCl2tNZ0kE8sIBO6YOn96Q==", + "dependencies": { + "colorspace": "1.1.x", + "enabled": "2.0.x", + "kuler": "^2.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/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/@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/highlight": "^7.10.4" + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/@eth-optimism/contracts": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@eth-optimism/contracts/-/contracts-0.6.0.tgz", + "integrity": "sha512-vQ04wfG9kMf1Fwy3FEMqH2QZbgS0gldKhcBeBUPfO8zu68L61VI97UDXmsMQXzTsEAxK8HnokW3/gosl4/NW3w==", + "dependencies": { + "@eth-optimism/core-utils": "0.12.0", + "@ethersproject/abstract-provider": "^5.7.0", + "@ethersproject/abstract-signer": "^5.7.0" + }, + "peerDependencies": { + "ethers": "^5" + } + }, + "node_modules/@eth-optimism/contracts-bedrock": { + "version": "0.16.2", + "resolved": "https://registry.npmjs.org/@eth-optimism/contracts-bedrock/-/contracts-bedrock-0.16.2.tgz", + "integrity": "sha512-a2+f7soDbrd6jV74U02EpyMwQt2iZeDZ4c2ZwgkObcxXUZLZQ2ELt/VRFBf8TIL3wYcBOGpUa1aXAE2oHQ7oRA==", + "hasInstallScript": true + }, + "node_modules/@eth-optimism/contracts/node_modules/@eth-optimism/core-utils": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@eth-optimism/core-utils/-/core-utils-0.12.0.tgz", + "integrity": "sha512-qW+7LZYCz7i8dRa7SRlUKIo1VBU8lvN0HeXCxJR+z+xtMzMQpPds20XJNCMclszxYQHkXY00fOT6GvFw9ZL6nw==", + "dependencies": { + "@ethersproject/abi": "^5.7.0", + "@ethersproject/abstract-provider": "^5.7.0", + "@ethersproject/address": "^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/keccak256": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/providers": "^5.7.0", + "@ethersproject/rlp": "^5.7.0", + "@ethersproject/transactions": "^5.7.0", + "@ethersproject/web": "^5.7.0", + "bufio": "^1.0.7", + "chai": "^4.3.4" + } + }, + "node_modules/@eth-optimism/contracts/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/@eth-optimism/contracts/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/@eth-optimism/contracts/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/@eth-optimism/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/@eth-optimism/contracts/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/@eth-optimism/contracts/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/@eth-optimism/contracts/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/@eth-optimism/contracts/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/@eth-optimism/contracts/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/@eth-optimism/contracts/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/@eth-optimism/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": { + "@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/@eth-optimism/contracts/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/@eth-optimism/contracts/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/@eth-optimism/contracts/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/@eth-optimism/contracts/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/@eth-optimism/contracts/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/@eth-optimism/contracts/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/@eth-optimism/contracts/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/@eth-optimism/contracts/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/@eth-optimism/contracts/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/@eth-optimism/contracts/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/@eth-optimism/contracts/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/@eth-optimism/contracts/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/@eth-optimism/contracts/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/@eth-optimism/contracts/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/@eth-optimism/contracts/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/@eth-optimism/core-utils": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/@eth-optimism/core-utils/-/core-utils-0.13.1.tgz", + "integrity": "sha512-1FvzbUmCEy9zSKPG1QWg2VfA2Cy90xBA9Wkp11lXXrz91zUPCNCNSRTujXWYIC86ketNsZp7p4njSf6lTycHCw==", + "hasInstallScript": true, + "dependencies": { + "@ethersproject/abi": "^5.7.0", + "@ethersproject/abstract-provider": "^5.7.0", + "@ethersproject/address": "^5.7.0", + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/constants": "^5.7.0", + "@ethersproject/contracts": "^5.7.0", + "@ethersproject/keccak256": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/rlp": "^5.7.0", + "@ethersproject/web": "^5.7.1", + "chai": "^4.3.9", + "ethers": "^5.7.2", + "node-fetch": "^2.6.7" + } + }, + "node_modules/@eth-optimism/core-utils/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/@eth-optimism/core-utils/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/@eth-optimism/core-utils/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/@eth-optimism/core-utils/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/@eth-optimism/core-utils/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/@eth-optimism/core-utils/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/@eth-optimism/core-utils/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/@eth-optimism/core-utils/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/@eth-optimism/core-utils/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/@eth-optimism/core-utils/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/@eth-optimism/core-utils/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/@eth-optimism/core-utils/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/@eth-optimism/core-utils/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/@eth-optimism/core-utils/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/@eth-optimism/core-utils/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/@eth-optimism/core-utils/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/@eth-optimism/core-utils/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/@eth-optimism/core-utils/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/@eth-optimism/core-utils/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/@eth-optimism/core-utils/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/@eth-optimism/core-utils/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/@eth-optimism/core-utils/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/@eth-optimism/core-utils/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/@babel/helper-validator-identifier": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", - "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==", - "dev": true, - "engines": { - "node": ">=6.9.0" + "node_modules/@eth-optimism/core-utils/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/@babel/highlight": { - "version": "7.16.10", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.10.tgz", - "integrity": "sha512-5FnTQLSLswEj6IkgVw5KusNUUFY9ZGqe/TRFnP/BKYHYgfh7tc+C7mwiy95/yNP7Dh9x580Vv8r7u7ZfTBFxdw==", - "dev": true, + "node_modules/@eth-optimism/core-utils/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": { - "@babel/helper-validator-identifier": "^7.16.7", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - }, - "engines": { - "node": ">=6.9.0" + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/constants": "^5.7.0", + "@ethersproject/logger": "^5.7.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, + "node_modules/@eth-optimism/core-utils/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": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" + "@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/@eth-optimism/core-utils/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/@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, + "node_modules/@eth-optimism/core-utils/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": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" + "@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/@eth-optimism/core-utils/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/@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, + "node_modules/@eth-optimism/core-utils/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": { - "color-name": "1.1.3" + "@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/@babel/highlight/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true + "node_modules/@eth-optimism/core-utils/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/@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": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true, + "node_modules/@eth-optimism/core-utils/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": ">=0.8.0" + "node": ">=4" } }, - "node_modules/@babel/runtime": { - "version": "7.17.8", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.17.8.tgz", - "integrity": "sha512-dQpEpK0O9o6lj6oPu0gRDbbnk+4LeHlNcBpspf6Olzt3GIX4P1lWF1gS+pHLDFlaJvbR6q7jCfQ08zA4QJBnmA==", + "node_modules/@eth-optimism/core-utils/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": { - "regenerator-runtime": "^0.13.4" + "type-detect": "^4.0.0" }, "engines": { - "node": ">=6.9.0" + "node": ">=6" } }, - "node_modules/@babel/runtime/node_modules/regenerator-runtime": { - "version": "0.13.9", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", - "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==" - }, - "node_modules/@dabh/diagnostics": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.2.tgz", - "integrity": "sha512-+A1YivoVDNNVCdfozHSR8v/jyuuLTMXwjWuxPFlFlUapXoGc+Gj9mDlTDDfrwl7rXCl2tNZ0kE8sIBO6YOn96Q==", + "node_modules/@eth-optimism/core-utils/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": { - "colorspace": "1.1.x", - "enabled": "2.0.x", - "kuler": "^2.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, + "@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-optimism/sdk": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/@eth-optimism/sdk/-/sdk-3.1.8.tgz", + "integrity": "sha512-hvv7f3xE5JWIRN1lSiBUeRXdr2Ue+Ircgl612Gi/WvW1M3KGWQzCO0GYl858yheM8ROZOboOjSyKRy+ObubJkw==", + "hasInstallScript": 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" + "@eth-optimism/contracts": "0.6.0", + "@eth-optimism/contracts-bedrock": "0.16.2", + "@eth-optimism/core-utils": "0.13.1", + "lodash": "^4.17.21", + "merkletreejs": "^0.3.11", + "rlp": "^2.2.7" }, - "engines": { - "node": "^10.12.0 || >=12.0.0" + "peerDependencies": { + "ethers": "^5" } }, - "node_modules/@eslint/eslintrc/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, + "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": ">= 4" + "node": ">=14" } }, - "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, + "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": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" + "@ethereumjs/rlp": "^4.0.1", + "ethereum-cryptography": "^2.0.0", + "micro-ftch": "^0.3.1" }, - "bin": { - "js-yaml": "bin/js-yaml.js" + "engines": { + "node": ">=14" } }, "node_modules/@ethersproject/abi": { @@ -1066,6 +2445,28 @@ "win32" ] }, + "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/@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/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -1182,6 +2583,39 @@ "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.0.tgz", "integrity": "sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw==" }, + "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==", + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "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/@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/@sideway/address": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.3.tgz", @@ -1551,6 +2985,11 @@ "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==" }, + "node_modules/@types/minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==" + }, "node_modules/@types/mocha": { "version": "8.2.3", "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-8.2.3.tgz", @@ -1594,6 +3033,11 @@ "resolved": "https://registry.npmjs.org/@types/node/-/node-14.11.11.tgz", "integrity": "sha512-UcaAZrL8uO5GNS+NLxkYg1RiOMgdLxCXGqs+TTupltXN8rTvUEKTOpqCV3tlcAIZJXzcBQajzmjdrvuPvnuMUw==" }, + "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==" + }, "node_modules/@types/qs": { "version": "6.9.7", "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", @@ -2196,6 +3640,14 @@ "node": ">=0.10.0" } }, + "node_modules/arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/asap": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", @@ -2212,7 +3664,6 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", - "dev": true, "engines": { "node": "*" } @@ -2700,6 +4151,11 @@ "node": ">=4.5" } }, + "node_modules/buffer-reverse": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/buffer-reverse/-/buffer-reverse-1.0.1.tgz", + "integrity": "sha512-M87YIUBsZ6N924W57vDwT/aOu8hw7ZgdByz6ijksLjmHJELBASmYTTlNHRgjE+pTsT9oJXGaDSgqqwfdHotDUg==" + }, "node_modules/bufferutil": { "version": "4.0.6", "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.6.tgz", @@ -2710,7 +4166,15 @@ "node-gyp-build": "^4.3.0" }, "engines": { - "node": ">=6.14.2" + "node": ">=6.14.2" + } + }, + "node_modules/bufio": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/bufio/-/bufio-1.2.1.tgz", + "integrity": "sha512-9oR3zNdupcg/Ge2sSHQF3GX+kmvL/fTPvD0nd5AGLq8SjUYnTz+SlFjK/GXidndbZtIj+pVKXiWeR9w6e9wKCA==", + "engines": { + "node": ">=14.0.0" } }, "node_modules/bullmq": { @@ -3024,10 +4488,12 @@ } }, "node_modules/check-error": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", - "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=", - "dev": true, + "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": "*" } @@ -3458,6 +4924,11 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/crypto-js": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.2.0.tgz", + "integrity": "sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==" + }, "node_modules/crypto-random-string": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-3.3.1.tgz", @@ -3534,11 +5005,25 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true, "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==", + "dependencies": { + "decamelize": "^1.1.0", + "map-obj": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/decode-uri-component": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", @@ -3835,7 +5320,6 @@ "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, "dependencies": { "is-arrayish": "^0.2.1" } @@ -3843,8 +5327,7 @@ "node_modules/error-ex/node_modules/is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", - "dev": true + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" }, "node_modules/es6-promise": { "version": "4.2.8", @@ -4028,24 +5511,303 @@ "node": ">=0.10.0" } }, - "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, + "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/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/eslint/node_modules/semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint/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/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==", + "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": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", + "engines": { + "node": ">= 0.6" + } + }, + "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": "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/ethereum-input-data-decoder": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/ethereum-input-data-decoder/-/ethereum-input-data-decoder-0.4.2.tgz", + "integrity": "sha512-nzdb9YEZ/oMIywN6AxuZtwUxYoCss5/DDbHKIaDxVEll/zQLy/CxZkNCaZJGJ+QtP/8DTtrBPc46o7Y683ZZ2A==", + "dependencies": { + "@types/node": "^16.7.13", + "bn.js": "^4.11.8", + "buffer": "^5.2.1", + "ethers": "^5.5.4", + "is-buffer": "^2.0.3", + "meow": "9.0.0" + }, + "bin": { + "ethereum_input_data_decoder": "bin/ethereum_input_data_decoder", + "ethereum-input-data-decoder": "bin/ethereum_input_data_decoder" + } + }, + "node_modules/ethereum-input-data-decoder/node_modules/@types/node": { + "version": "16.18.79", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.79.tgz", + "integrity": "sha512-Qd7jdLR5zmnIyMhfDrfPqN5tUCvreVpP3Qrf2oSM+F7SNzlb/MwHISGUkdFHtevfkPJ3iAGyeQI/jsbh9EStgQ==" + }, + "node_modules/ethereum-input-data-decoder/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/ethereum-input-data-decoder/node_modules/camelcase-keys": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz", + "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==", + "dependencies": { + "camelcase": "^5.3.1", + "map-obj": "^4.0.0", + "quick-lru": "^4.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ethereum-input-data-decoder/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==", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ethereum-input-data-decoder/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==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/ethereum-input-data-decoder/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/ethereum-input-data-decoder/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/ethereum-input-data-decoder/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==", "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" + "p-locate": "^4.1.0" }, - "bin": { - "js-yaml": "bin/js-yaml.js" + "engines": { + "node": ">=8" } }, - "node_modules/eslint/node_modules/lru-cache": { + "node_modules/ethereum-input-data-decoder/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" }, @@ -4053,130 +5815,221 @@ "node": ">=10" } }, - "node_modules/eslint/node_modules/semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" + "node_modules/ethereum-input-data-decoder/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==", + "engines": { + "node": ">=8" }, - "bin": { - "semver": "bin/semver.js" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ethereum-input-data-decoder/node_modules/meow": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-9.0.0.tgz", + "integrity": "sha512-+obSblOQmRhcyBt62furQqRAQpNyWXo8BuQ5bN7dG8wmwQ+vwHKp/rCFD4CrTP8CsDQD1sjoZ94K417XEUk8IQ==", + "dependencies": { + "@types/minimist": "^1.2.0", + "camelcase-keys": "^6.2.2", + "decamelize": "^1.2.0", + "decamelize-keys": "^1.1.0", + "hard-rejection": "^2.1.0", + "minimist-options": "4.1.0", + "normalize-package-data": "^3.0.0", + "read-pkg-up": "^7.0.1", + "redent": "^3.0.0", + "trim-newlines": "^3.0.0", + "type-fest": "^0.18.0", + "yargs-parser": "^20.2.3" }, "engines": { "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/eslint/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/ethereum-input-data-decoder/node_modules/meow/node_modules/type-fest": { + "version": "0.18.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", + "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", + "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, + "node_modules/ethereum-input-data-decoder/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==", "dependencies": { - "acorn": "^7.4.0", - "acorn-jsx": "^5.3.1", - "eslint-visitor-keys": "^1.3.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.12.0 || >=12.0.0" + "node": ">=10" } }, - "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, + "node_modules/ethereum-input-data-decoder/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==", + "dependencies": { + "p-try": "^2.0.0" + }, "engines": { - "node": ">=4" + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "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==", - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" + "node_modules/ethereum-input-data-decoder/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==", + "dependencies": { + "p-limit": "^2.2.0" }, "engines": { - "node": ">=4" + "node": ">=8" } }, - "node_modules/esquery": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", - "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", - "dev": true, + "node_modules/ethereum-input-data-decoder/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==", "dependencies": { - "estraverse": "^5.1.0" + "@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": ">=0.10" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "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, + "node_modules/ethereum-input-data-decoder/node_modules/read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "dependencies": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, "engines": { - "node": ">=4.0" + "node": ">=8" } }, - "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, + "node_modules/ethereum-input-data-decoder/node_modules/read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", "dependencies": { - "estraverse": "^5.2.0" + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" }, "engines": { - "node": ">=4.0" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "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, + "node_modules/ethereum-input-data-decoder/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==" + }, + "node_modules/ethereum-input-data-decoder/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==", + "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/ethereum-input-data-decoder/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==", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/ethereum-input-data-decoder/node_modules/read-pkg/node_modules/type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", "engines": { - "node": ">=4.0" + "node": ">=8" } }, - "node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true, + "node_modules/ethereum-input-data-decoder/node_modules/redent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", + "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", + "dependencies": { + "indent-string": "^4.0.0", + "strip-indent": "^3.0.0" + }, "engines": { - "node": ">=4.0" + "node": ">=8" } }, - "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, + "node_modules/ethereum-input-data-decoder/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": ">=0.10.0" + "node": ">=10" } }, - "node_modules/etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", + "node_modules/ethereum-input-data-decoder/node_modules/strip-indent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", + "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", + "dependencies": { + "min-indent": "^1.0.0" + }, "engines": { - "node": ">= 0.6" + "node": ">=8" + } + }, + "node_modules/ethereum-input-data-decoder/node_modules/trim-newlines": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz", + "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==", + "engines": { + "node": ">=8" } }, + "node_modules/ethereum-input-data-decoder/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/ethers": { "version": "5.5.4", "resolved": "https://registry.npmjs.org/ethers/-/ethers-5.5.4.tgz", @@ -4224,6 +6077,24 @@ "@ethersproject/wordlists": "5.5.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/event-stream": { "version": "3.3.4", "resolved": "https://registry.npmjs.org/event-stream/-/event-stream-3.3.4.tgz", @@ -4844,10 +6715,9 @@ } }, "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": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=", - "dev": true, + "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": "*" } @@ -5008,6 +6878,14 @@ "node": ">=4.x" } }, + "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==", + "engines": { + "node": ">=6" + } + }, "node_modules/has": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", @@ -5023,7 +6901,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true, "engines": { "node": ">=4" } @@ -5482,6 +7359,15 @@ "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", @@ -5681,8 +7567,7 @@ "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 + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" }, "node_modules/js-yaml": { "version": "4.0.0", @@ -5700,6 +7585,11 @@ "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" }, + "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==" + }, "node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", @@ -5866,6 +7756,11 @@ "resolved": "https://registry.npmjs.org/limiter/-/limiter-1.1.5.tgz", "integrity": "sha512-FWWMIEOxz3GwUI4Ts/IvgVy6LPvoMPgjMdQ185nN6psJyBJ4yOpzqm695/h5umdLJg2vW3GR5iG11MAkR2AzJA==" }, + "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==" + }, "node_modules/load-json-file": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", @@ -6016,6 +7911,14 @@ "node": ">=0.10.0" } }, + "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", @@ -6095,7 +7998,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -6177,6 +8079,21 @@ "node": ">= 8" } }, + "node_modules/merkletreejs": { + "version": "0.3.11", + "resolved": "https://registry.npmjs.org/merkletreejs/-/merkletreejs-0.3.11.tgz", + "integrity": "sha512-LJKTl4iVNTndhL+3Uz/tfkjD0klIWsHlUzgtuNnNrsf7bAlXR30m+xYB7lHr5Z/l6e/yAIsr26Dabx6Buo4VGQ==", + "dependencies": { + "bignumber.js": "^9.0.1", + "buffer-reverse": "^1.0.1", + "crypto-js": "^4.2.0", + "treeify": "^1.1.0", + "web3-utils": "^1.3.4" + }, + "engines": { + "node": ">= 7.6.0" + } + }, "node_modules/methods": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", @@ -6185,6 +8102,11 @@ "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": "2.3.11", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", @@ -6247,6 +8169,14 @@ "node": ">=6" } }, + "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==", + "engines": { + "node": ">=4" + } + }, "node_modules/minimalistic-assert": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", @@ -6273,6 +8203,35 @@ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" }, + "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==", + "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==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/minimist-options/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==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/minipass": { "version": "3.1.6", "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.6.tgz", @@ -7374,6 +9333,24 @@ "set-blocking": "^2.0.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/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -7582,7 +9559,6 @@ "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" } @@ -7675,7 +9651,6 @@ "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" } @@ -7720,7 +9695,6 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", - "dev": true, "engines": { "node": "*" } @@ -7926,6 +9900,14 @@ } ] }, + "node_modules/quick-lru": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", + "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==", + "engines": { + "node": ">=8" + } + }, "node_modules/randomatic": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.1.1.tgz", @@ -7959,7 +9941,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, "dependencies": { "safe-buffer": "^5.1.0" } @@ -8674,6 +10655,22 @@ "url": "https://github.com/sponsors/isaacs" } }, + "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/rlp/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/rosie": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/rosie/-/rosie-2.1.0.tgz", @@ -9274,7 +11271,6 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", - "dev": true, "dependencies": { "spdx-expression-parse": "^3.0.0", "spdx-license-ids": "^3.0.0" @@ -9283,14 +11279,12 @@ "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==", - "dev": true + "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==", - "dev": true, "dependencies": { "spdx-exceptions": "^2.1.0", "spdx-license-ids": "^3.0.0" @@ -9299,8 +11293,7 @@ "node_modules/spdx-license-ids": { "version": "3.0.11", "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.11.tgz", - "integrity": "sha512-Ctl2BrFiM0X3MANYgj3CkygxhRmr9mi6xhejbdO960nF6EDJApTYpn0BQnDKlnNBULKiCN1n3w9EBkHK8ZWg+g==", - "dev": true + "integrity": "sha512-Ctl2BrFiM0X3MANYgj3CkygxhRmr9mi6xhejbdO960nF6EDJApTYpn0BQnDKlnNBULKiCN1n3w9EBkHK8ZWg+g==" }, "node_modules/split": { "version": "0.3.3", @@ -9488,6 +11481,18 @@ "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", + "integrity": "sha512-q8d4ue7JGEiVcypji1bALTos+0pWtyGlivAWyPuTkHzuTCJqrK9sWxYQZUq6Nq3cuyv3bm734IhHvHtGGURU6A==", + "dependencies": { + "is-hex-prefixed": "1.0.0" + }, + "engines": { + "node": ">=6.5.0", + "npm": ">=3" + } + }, "node_modules/strip-indent": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", @@ -9693,7 +11698,6 @@ "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" }, @@ -9911,6 +11915,14 @@ "tree-kill": "cli.js" } }, + "node_modules/treeify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/treeify/-/treeify-1.1.0.tgz", + "integrity": "sha512-1m4RA7xVAJrSGrrXGs0L3YTwyvBs2S8PbRHaLZAkFw7JR8oIFwYtysxlBZhYIa7xSyiYJKZ3iGrrk55cGA3i9A==", + "engines": { + "node": ">=0.6" + } + }, "node_modules/trim-newlines": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", @@ -10356,7 +12368,6 @@ "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==", - "dev": true, "engines": { "node": ">=4" } @@ -10517,6 +12528,11 @@ "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-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -10557,7 +12573,6 @@ "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==", - "dev": true, "dependencies": { "spdx-correct": "^3.0.0", "spdx-expression-parse": "^3.0.0" @@ -10590,6 +12605,29 @@ "node": ">=8.9.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==", + "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/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/webidl-conversions": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", @@ -10839,7 +12877,6 @@ "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, "requires": { "@babel/highlight": "^7.10.4" } @@ -10847,14 +12884,12 @@ "@babel/helper-validator-identifier": { "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", - "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==", - "dev": true + "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==" }, "@babel/highlight": { "version": "7.16.10", "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.10.tgz", "integrity": "sha512-5FnTQLSLswEj6IkgVw5KusNUUFY9ZGqe/TRFnP/BKYHYgfh7tc+C7mwiy95/yNP7Dh9x580Vv8r7u7ZfTBFxdw==", - "dev": true, "requires": { "@babel/helper-validator-identifier": "^7.16.7", "chalk": "^2.0.0", @@ -10865,7 +12900,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, "requires": { "color-convert": "^1.9.0" } @@ -10874,7 +12908,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, "requires": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -10885,7 +12918,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, "requires": { "color-name": "1.1.3" } @@ -10893,14 +12925,12 @@ "color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" }, "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" } } }, @@ -10964,6 +12994,825 @@ } } }, + "@eth-optimism/contracts": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@eth-optimism/contracts/-/contracts-0.6.0.tgz", + "integrity": "sha512-vQ04wfG9kMf1Fwy3FEMqH2QZbgS0gldKhcBeBUPfO8zu68L61VI97UDXmsMQXzTsEAxK8HnokW3/gosl4/NW3w==", + "requires": { + "@eth-optimism/core-utils": "0.12.0", + "@ethersproject/abstract-provider": "^5.7.0", + "@ethersproject/abstract-signer": "^5.7.0" + }, + "dependencies": { + "@eth-optimism/core-utils": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@eth-optimism/core-utils/-/core-utils-0.12.0.tgz", + "integrity": "sha512-qW+7LZYCz7i8dRa7SRlUKIo1VBU8lvN0HeXCxJR+z+xtMzMQpPds20XJNCMclszxYQHkXY00fOT6GvFw9ZL6nw==", + "requires": { + "@ethersproject/abi": "^5.7.0", + "@ethersproject/abstract-provider": "^5.7.0", + "@ethersproject/address": "^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/keccak256": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/providers": "^5.7.0", + "@ethersproject/rlp": "^5.7.0", + "@ethersproject/transactions": "^5.7.0", + "@ethersproject/web": "^5.7.0", + "bufio": "^1.0.7", + "chai": "^4.3.4" + } + }, + "@ethersproject/abi": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/abi/-/abi-5.7.0.tgz", + "integrity": "sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA==", + "requires": { + "@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": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/abstract-provider/-/abstract-provider-5.7.0.tgz", + "integrity": "sha512-R41c9UkchKCpAqStMYUpdunjo3pkEvZC3FAwZn5S5MGbXoMQOHIdHItezTETxAO5bevtMApSyEhn9+CHcDsWBw==", + "requires": { + "@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": { + "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==", + "requires": { + "@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": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.7.0.tgz", + "integrity": "sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA==", + "requires": { + "@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": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/base64/-/base64-5.7.0.tgz", + "integrity": "sha512-Dr8tcHt2mEbsZr/mwTPIQAf3Ai0Bks/7gTw9dSqk1mQvhW3XvRlmDJr/4n+wg1JmCl16NZue17CDh8xb/vZ0sQ==", + "requires": { + "@ethersproject/bytes": "^5.7.0" + } + }, + "@ethersproject/basex": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/basex/-/basex-5.7.0.tgz", + "integrity": "sha512-ywlh43GwZLv2Voc2gQVTKBoVQ1mti3d8HK5aMxsfu/nRDnMmNqaSJ3r3n85HBByT8OpoY96SXM1FogC533T4zw==", + "requires": { + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/properties": "^5.7.0" + } + }, + "@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==", + "requires": { + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "bn.js": "^5.2.1" + } + }, + "@ethersproject/bytes": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.7.0.tgz", + "integrity": "sha512-nsbxwgFXWh9NyYWo+U8atvmMsSdKJprTcICAkvbBffT75qDocbuggBU0SJiVK2MuTrp0q+xvLkTnGMPK1+uA9A==", + "requires": { + "@ethersproject/logger": "^5.7.0" + } + }, + "@ethersproject/constants": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/constants/-/constants-5.7.0.tgz", + "integrity": "sha512-DHI+y5dBNvkpYUMiRQyxRBYBefZkJfo70VUkUAsRjcPs47muV9evftfZ0PJVCXYbAiCgght0DtcF9srFQmIgWA==", + "requires": { + "@ethersproject/bignumber": "^5.7.0" + } + }, + "@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==", + "requires": { + "@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": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/hash/-/hash-5.7.0.tgz", + "integrity": "sha512-qX5WrQfnah1EFnO5zJv1v46a8HW0+E5xuBBDTwMFZLuVTx0tbU2kkx15NqdjxecrLGatQN9FGQKpb1FKdHCt+g==", + "requires": { + "@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": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/keccak256/-/keccak256-5.7.0.tgz", + "integrity": "sha512-2UcPboeL/iW+pSg6vZ6ydF8tCnv3Iu/8tUmLLzWWGzxWKFFqOBQFLo6uLUv6BDrLgCDfN28RJ/wtByx+jZ4KBg==", + "requires": { + "@ethersproject/bytes": "^5.7.0", + "js-sha3": "0.8.0" + } + }, + "@ethersproject/logger": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.7.0.tgz", + "integrity": "sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig==" + }, + "@ethersproject/networks": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/@ethersproject/networks/-/networks-5.7.1.tgz", + "integrity": "sha512-n/MufjFYv3yFcUyfhnXotyDlNdFb7onmkSy8aQERi2PjNcnWQ66xXxa3XlS8nCcA8aJKJjIIMNJTC7tu80GwpQ==", + "requires": { + "@ethersproject/logger": "^5.7.0" + } + }, + "@ethersproject/properties": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/properties/-/properties-5.7.0.tgz", + "integrity": "sha512-J87jy8suntrAkIZtecpxEPxY//szqr1mlBaYlQ0r4RCaiD2hjheqF9s1LVE8vVuJCXisjIP+JgtK/Do54ej4Sw==", + "requires": { + "@ethersproject/logger": "^5.7.0" + } + }, + "@ethersproject/providers": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/@ethersproject/providers/-/providers-5.7.2.tgz", + "integrity": "sha512-g34EWZ1WWAVgr4aptGlVBF8mhl3VWjv+8hoAnzStu8Ah22VHBsuGzP17eb6xDVRzw895G4W7vvx60lFFur/1Rg==", + "requires": { + "@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": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/random/-/random-5.7.0.tgz", + "integrity": "sha512-19WjScqRA8IIeWclFme75VMXSBvi4e6InrUNuaR4s5pTF2qNhcGdCUwdxUVGtDDqC00sDLCO93jPQoDUH4HVmQ==", + "requires": { + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0" + } + }, + "@ethersproject/rlp": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/rlp/-/rlp-5.7.0.tgz", + "integrity": "sha512-rBxzX2vK8mVF7b0Tol44t5Tb8gomOHkj5guL+HhzQ1yBh/ydjGnpw6at+X6Iw0Kp3OzzzkcKp8N9r0W4kYSs9w==", + "requires": { + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0" + } + }, + "@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==", + "requires": { + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "hash.js": "1.1.7" + } + }, + "@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==", + "requires": { + "@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": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/strings/-/strings-5.7.0.tgz", + "integrity": "sha512-/9nu+lj0YswRNSH0NXYqrh8775XNyEdUQAuf3f+SmOrnVewcJ5SBNAjF7lpgehKi4abvNNXyf+HX86czCdJ8Mg==", + "requires": { + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/constants": "^5.7.0", + "@ethersproject/logger": "^5.7.0" + } + }, + "@ethersproject/transactions": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/transactions/-/transactions-5.7.0.tgz", + "integrity": "sha512-kmcNicCp1lp8qanMTC3RIikGgoJ80ztTyvtsFvCYpSCfkjhD0jZ2LOrnbcuxuToLIUYYf+4XwD1rP+B/erDIhQ==", + "requires": { + "@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": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/@ethersproject/web/-/web-5.7.1.tgz", + "integrity": "sha512-Gueu8lSvyjBWL4cYsWsjh6MtMwM0+H4HvqFPZfB6dV8ctbP9zFAO73VG1cMWae0FLPCtz0peKPpZY8/ugJJX2w==", + "requires": { + "@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" + } + }, + "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==" + }, + "chai": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.4.1.tgz", + "integrity": "sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g==", + "requires": { + "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" + } + }, + "deep-eql": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz", + "integrity": "sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==", + "requires": { + "type-detect": "^4.0.0" + } + } + } + }, + "@eth-optimism/contracts-bedrock": { + "version": "0.16.2", + "resolved": "https://registry.npmjs.org/@eth-optimism/contracts-bedrock/-/contracts-bedrock-0.16.2.tgz", + "integrity": "sha512-a2+f7soDbrd6jV74U02EpyMwQt2iZeDZ4c2ZwgkObcxXUZLZQ2ELt/VRFBf8TIL3wYcBOGpUa1aXAE2oHQ7oRA==" + }, + "@eth-optimism/core-utils": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/@eth-optimism/core-utils/-/core-utils-0.13.1.tgz", + "integrity": "sha512-1FvzbUmCEy9zSKPG1QWg2VfA2Cy90xBA9Wkp11lXXrz91zUPCNCNSRTujXWYIC86ketNsZp7p4njSf6lTycHCw==", + "requires": { + "@ethersproject/abi": "^5.7.0", + "@ethersproject/abstract-provider": "^5.7.0", + "@ethersproject/address": "^5.7.0", + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/constants": "^5.7.0", + "@ethersproject/contracts": "^5.7.0", + "@ethersproject/keccak256": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/rlp": "^5.7.0", + "@ethersproject/web": "^5.7.1", + "chai": "^4.3.9", + "ethers": "^5.7.2", + "node-fetch": "^2.6.7" + }, + "dependencies": { + "@ethersproject/abi": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/abi/-/abi-5.7.0.tgz", + "integrity": "sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA==", + "requires": { + "@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": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/abstract-provider/-/abstract-provider-5.7.0.tgz", + "integrity": "sha512-R41c9UkchKCpAqStMYUpdunjo3pkEvZC3FAwZn5S5MGbXoMQOHIdHItezTETxAO5bevtMApSyEhn9+CHcDsWBw==", + "requires": { + "@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": { + "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==", + "requires": { + "@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": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.7.0.tgz", + "integrity": "sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA==", + "requires": { + "@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": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/base64/-/base64-5.7.0.tgz", + "integrity": "sha512-Dr8tcHt2mEbsZr/mwTPIQAf3Ai0Bks/7gTw9dSqk1mQvhW3XvRlmDJr/4n+wg1JmCl16NZue17CDh8xb/vZ0sQ==", + "requires": { + "@ethersproject/bytes": "^5.7.0" + } + }, + "@ethersproject/basex": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/basex/-/basex-5.7.0.tgz", + "integrity": "sha512-ywlh43GwZLv2Voc2gQVTKBoVQ1mti3d8HK5aMxsfu/nRDnMmNqaSJ3r3n85HBByT8OpoY96SXM1FogC533T4zw==", + "requires": { + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/properties": "^5.7.0" + } + }, + "@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==", + "requires": { + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "bn.js": "^5.2.1" + } + }, + "@ethersproject/bytes": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.7.0.tgz", + "integrity": "sha512-nsbxwgFXWh9NyYWo+U8atvmMsSdKJprTcICAkvbBffT75qDocbuggBU0SJiVK2MuTrp0q+xvLkTnGMPK1+uA9A==", + "requires": { + "@ethersproject/logger": "^5.7.0" + } + }, + "@ethersproject/constants": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/constants/-/constants-5.7.0.tgz", + "integrity": "sha512-DHI+y5dBNvkpYUMiRQyxRBYBefZkJfo70VUkUAsRjcPs47muV9evftfZ0PJVCXYbAiCgght0DtcF9srFQmIgWA==", + "requires": { + "@ethersproject/bignumber": "^5.7.0" + } + }, + "@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==", + "requires": { + "@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": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/hash/-/hash-5.7.0.tgz", + "integrity": "sha512-qX5WrQfnah1EFnO5zJv1v46a8HW0+E5xuBBDTwMFZLuVTx0tbU2kkx15NqdjxecrLGatQN9FGQKpb1FKdHCt+g==", + "requires": { + "@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": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/hdnode/-/hdnode-5.7.0.tgz", + "integrity": "sha512-OmyYo9EENBPPf4ERhR7oj6uAtUAhYGqOnIS+jE5pTXvdKBS99ikzq1E7Iv0ZQZ5V36Lqx1qZLeak0Ra16qpeOg==", + "requires": { + "@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": { + "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==", + "requires": { + "@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": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/keccak256/-/keccak256-5.7.0.tgz", + "integrity": "sha512-2UcPboeL/iW+pSg6vZ6ydF8tCnv3Iu/8tUmLLzWWGzxWKFFqOBQFLo6uLUv6BDrLgCDfN28RJ/wtByx+jZ4KBg==", + "requires": { + "@ethersproject/bytes": "^5.7.0", + "js-sha3": "0.8.0" + } + }, + "@ethersproject/logger": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.7.0.tgz", + "integrity": "sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig==" + }, + "@ethersproject/networks": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/@ethersproject/networks/-/networks-5.7.1.tgz", + "integrity": "sha512-n/MufjFYv3yFcUyfhnXotyDlNdFb7onmkSy8aQERi2PjNcnWQ66xXxa3XlS8nCcA8aJKJjIIMNJTC7tu80GwpQ==", + "requires": { + "@ethersproject/logger": "^5.7.0" + } + }, + "@ethersproject/pbkdf2": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/pbkdf2/-/pbkdf2-5.7.0.tgz", + "integrity": "sha512-oR/dBRZR6GTyaofd86DehG72hY6NpAjhabkhxgr3X2FpJtJuodEl2auADWBZfhDHgVCbu3/H/Ocq2uC6dpNjjw==", + "requires": { + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/sha2": "^5.7.0" + } + }, + "@ethersproject/properties": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/properties/-/properties-5.7.0.tgz", + "integrity": "sha512-J87jy8suntrAkIZtecpxEPxY//szqr1mlBaYlQ0r4RCaiD2hjheqF9s1LVE8vVuJCXisjIP+JgtK/Do54ej4Sw==", + "requires": { + "@ethersproject/logger": "^5.7.0" + } + }, + "@ethersproject/providers": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/@ethersproject/providers/-/providers-5.7.2.tgz", + "integrity": "sha512-g34EWZ1WWAVgr4aptGlVBF8mhl3VWjv+8hoAnzStu8Ah22VHBsuGzP17eb6xDVRzw895G4W7vvx60lFFur/1Rg==", + "requires": { + "@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": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/random/-/random-5.7.0.tgz", + "integrity": "sha512-19WjScqRA8IIeWclFme75VMXSBvi4e6InrUNuaR4s5pTF2qNhcGdCUwdxUVGtDDqC00sDLCO93jPQoDUH4HVmQ==", + "requires": { + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0" + } + }, + "@ethersproject/rlp": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/rlp/-/rlp-5.7.0.tgz", + "integrity": "sha512-rBxzX2vK8mVF7b0Tol44t5Tb8gomOHkj5guL+HhzQ1yBh/ydjGnpw6at+X6Iw0Kp3OzzzkcKp8N9r0W4kYSs9w==", + "requires": { + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0" + } + }, + "@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==", + "requires": { + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "hash.js": "1.1.7" + } + }, + "@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==", + "requires": { + "@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": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/solidity/-/solidity-5.7.0.tgz", + "integrity": "sha512-HmabMd2Dt/raavyaGukF4XxizWKhKQ24DoLtdNbBmNKUOPqwjsKQSdV9GQtj9CBEea9DlzETlVER1gYeXXBGaA==", + "requires": { + "@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": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/strings/-/strings-5.7.0.tgz", + "integrity": "sha512-/9nu+lj0YswRNSH0NXYqrh8775XNyEdUQAuf3f+SmOrnVewcJ5SBNAjF7lpgehKi4abvNNXyf+HX86czCdJ8Mg==", + "requires": { + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/constants": "^5.7.0", + "@ethersproject/logger": "^5.7.0" + } + }, + "@ethersproject/transactions": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/transactions/-/transactions-5.7.0.tgz", + "integrity": "sha512-kmcNicCp1lp8qanMTC3RIikGgoJ80ztTyvtsFvCYpSCfkjhD0jZ2LOrnbcuxuToLIUYYf+4XwD1rP+B/erDIhQ==", + "requires": { + "@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": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/units/-/units-5.7.0.tgz", + "integrity": "sha512-pD3xLMy3SJu9kG5xDGI7+xhTEmGXlEqXU4OfNapmfnxLVY4EMSSRp7j1k7eezutBPH7RBN/7QPnwR7hzNlEFeg==", + "requires": { + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/constants": "^5.7.0", + "@ethersproject/logger": "^5.7.0" + } + }, + "@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==", + "requires": { + "@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": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/@ethersproject/web/-/web-5.7.1.tgz", + "integrity": "sha512-Gueu8lSvyjBWL4cYsWsjh6MtMwM0+H4HvqFPZfB6dV8ctbP9zFAO73VG1cMWae0FLPCtz0peKPpZY8/ugJJX2w==", + "requires": { + "@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": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/wordlists/-/wordlists-5.7.0.tgz", + "integrity": "sha512-S2TFNJNfHWVHNE6cNDjbVlZ6MgE17MIxMbMg2zv3wn+3XSJGosL1m9ZVv3GXCf/2ymSsQ+hRI5IzoMJTG6aoVA==", + "requires": { + "@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" + } + }, + "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==" + }, + "chai": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.4.1.tgz", + "integrity": "sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g==", + "requires": { + "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" + } + }, + "deep-eql": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz", + "integrity": "sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==", + "requires": { + "type-detect": "^4.0.0" + } + }, + "ethers": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/ethers/-/ethers-5.7.2.tgz", + "integrity": "sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg==", + "requires": { + "@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" + } + } + } + }, + "@eth-optimism/sdk": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/@eth-optimism/sdk/-/sdk-3.1.8.tgz", + "integrity": "sha512-hvv7f3xE5JWIRN1lSiBUeRXdr2Ue+Ircgl612Gi/WvW1M3KGWQzCO0GYl858yheM8ROZOboOjSyKRy+ObubJkw==", + "requires": { + "@eth-optimism/contracts": "0.6.0", + "@eth-optimism/contracts-bedrock": "0.16.2", + "@eth-optimism/core-utils": "0.13.1", + "lodash": "^4.17.21", + "merkletreejs": "^0.3.11", + "rlp": "^2.2.7" + } + }, + "@ethereumjs/rlp": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@ethereumjs/rlp/-/rlp-4.0.1.tgz", + "integrity": "sha512-tqsQiBQDQdmPWE1xkkBq4rlSW5QZpLOUJ5RJh2/9fug+q9tnUhuZoVLk7s0scUIKTOzEtR72DFBXI4WiZcMpvw==" + }, + "@ethereumjs/util": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@ethereumjs/util/-/util-8.1.0.tgz", + "integrity": "sha512-zQ0IqbdX8FZ9aw11vP+dZkKDkS+kgIvQPHnSAXzP9pLu+Rfu3D3XEeLbicvoXJTYnhZiPmsZUxgdzXwNKxRPbA==", + "requires": { + "@ethereumjs/rlp": "^4.0.1", + "ethereum-cryptography": "^2.0.0", + "micro-ftch": "^0.3.1" + } + }, "@ethersproject/abi": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/@ethersproject/abi/-/abi-5.5.0.tgz", @@ -11439,6 +14288,19 @@ "integrity": "sha512-rIZVR48zA8hGkHIK7ED6+ZiXsjRCcAVBJbm8o89OKAMTmEAQ2QvoOxoiu3w2isAaWwzgtQIOFIqHwvZDyLKCvw==", "optional": true }, + "@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==", + "requires": { + "@noble/hashes": "1.3.3" + } + }, + "@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==" + }, "@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -11538,6 +14400,30 @@ } } }, + "@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==" + }, + "@scure/bip32": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.3.3.tgz", + "integrity": "sha512-LJaN3HwRbfQK0X1xFSi0Q9amqOgzQnnDngIt+ZlsBC3Bm7/nE7K0kwshZHyaru79yIVRv/e1mQAjZyuZG6jOFQ==", + "requires": { + "@noble/curves": "~1.3.0", + "@noble/hashes": "~1.3.2", + "@scure/base": "~1.1.4" + } + }, + "@scure/bip39": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.2.2.tgz", + "integrity": "sha512-HYf9TUXG80beW+hGAt3TRM8wU6pQoYur9iNypTROm42dorCGmLnFe3eWjz3gOq6G62H2WRh0FCzAR1PI+29zIA==", + "requires": { + "@noble/hashes": "~1.3.2", + "@scure/base": "~1.1.4" + } + }, "@sideway/address": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.3.tgz", @@ -11866,6 +14752,11 @@ "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==" }, + "@types/minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==" + }, "@types/mocha": { "version": "8.2.3", "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-8.2.3.tgz", @@ -11913,6 +14804,11 @@ "resolved": "https://registry.npmjs.org/@types/node/-/node-14.11.11.tgz", "integrity": "sha512-UcaAZrL8uO5GNS+NLxkYg1RiOMgdLxCXGqs+TTupltXN8rTvUEKTOpqCV3tlcAIZJXzcBQajzmjdrvuPvnuMUw==" }, + "@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==" + }, "@types/qs": { "version": "6.9.7", "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", @@ -12365,6 +15261,11 @@ "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=" }, + "arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==" + }, "asap": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", @@ -12380,8 +15281,7 @@ "assertion-error": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", - "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", - "dev": true + "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==" }, "assign-symbols": { "version": "1.0.0", @@ -12784,6 +15684,11 @@ "resolved": "https://registry.npmjs.org/buffer-layout/-/buffer-layout-1.2.2.tgz", "integrity": "sha512-kWSuLN694+KTk8SrYvCqwP2WcgQjoRCiF5b4QDvkkz8EmgD+aWAIceGFKMIAdmF/pH+vpgNV3d3kAKorcdAmWA==" }, + "buffer-reverse": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/buffer-reverse/-/buffer-reverse-1.0.1.tgz", + "integrity": "sha512-M87YIUBsZ6N924W57vDwT/aOu8hw7ZgdByz6ijksLjmHJELBASmYTTlNHRgjE+pTsT9oJXGaDSgqqwfdHotDUg==" + }, "bufferutil": { "version": "4.0.6", "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.6.tgz", @@ -12793,6 +15698,11 @@ "node-gyp-build": "^4.3.0" } }, + "bufio": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/bufio/-/bufio-1.2.1.tgz", + "integrity": "sha512-9oR3zNdupcg/Ge2sSHQF3GX+kmvL/fTPvD0nd5AGLq8SjUYnTz+SlFjK/GXidndbZtIj+pVKXiWeR9w6e9wKCA==" + }, "bullmq": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/bullmq/-/bullmq-2.3.2.tgz", @@ -13039,10 +15949,12 @@ } }, "check-error": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", - "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=", - "dev": true + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.3.tgz", + "integrity": "sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==", + "requires": { + "get-func-name": "^2.0.2" + } }, "check-more-types": { "version": "2.24.0", @@ -13391,6 +16303,11 @@ "resolved": "https://registry.npmjs.org/crypto-hash/-/crypto-hash-1.3.0.tgz", "integrity": "sha512-lyAZ0EMyjDkVvz8WOeVnuCPvKVBXcMv1l5SVqO1yC7PzTwrD/pPje/BIRbWhMoPe436U+Y2nD7f5bFx0kt+Sbg==" }, + "crypto-js": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.2.0.tgz", + "integrity": "sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==" + }, "crypto-random-string": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-3.3.1.tgz", @@ -13441,8 +16358,16 @@ "decamelize": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" + }, + "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==", + "requires": { + "decamelize": "^1.1.0", + "map-obj": "^1.0.0" + } }, "decode-uri-component": { "version": "0.2.0", @@ -13676,7 +16601,6 @@ "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, "requires": { "is-arrayish": "^0.2.1" }, @@ -13684,8 +16608,7 @@ "is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", - "dev": true + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" } } }, @@ -13939,6 +16862,260 @@ "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" }, + "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==", + "requires": { + "js-sha3": "^0.8.0" + } + }, + "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==", + "requires": { + "@noble/curves": "1.3.0", + "@noble/hashes": "1.3.3", + "@scure/bip32": "1.3.3", + "@scure/bip39": "1.2.2" + } + }, + "ethereum-input-data-decoder": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/ethereum-input-data-decoder/-/ethereum-input-data-decoder-0.4.2.tgz", + "integrity": "sha512-nzdb9YEZ/oMIywN6AxuZtwUxYoCss5/DDbHKIaDxVEll/zQLy/CxZkNCaZJGJ+QtP/8DTtrBPc46o7Y683ZZ2A==", + "requires": { + "@types/node": "^16.7.13", + "bn.js": "^4.11.8", + "buffer": "^5.2.1", + "ethers": "^5.5.4", + "is-buffer": "^2.0.3", + "meow": "9.0.0" + }, + "dependencies": { + "@types/node": { + "version": "16.18.79", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.79.tgz", + "integrity": "sha512-Qd7jdLR5zmnIyMhfDrfPqN5tUCvreVpP3Qrf2oSM+F7SNzlb/MwHISGUkdFHtevfkPJ3iAGyeQI/jsbh9EStgQ==" + }, + "buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "camelcase-keys": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz", + "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==", + "requires": { + "camelcase": "^5.3.1", + "map-obj": "^4.0.0", + "quick-lru": "^4.0.1" + } + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "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==", + "requires": { + "lru-cache": "^6.0.0" + } + }, + "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==" + }, + "is-buffer": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", + "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==" + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "requires": { + "p-locate": "^4.1.0" + } + }, + "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==", + "requires": { + "yallist": "^4.0.0" + } + }, + "map-obj": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz", + "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==" + }, + "meow": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-9.0.0.tgz", + "integrity": "sha512-+obSblOQmRhcyBt62furQqRAQpNyWXo8BuQ5bN7dG8wmwQ+vwHKp/rCFD4CrTP8CsDQD1sjoZ94K417XEUk8IQ==", + "requires": { + "@types/minimist": "^1.2.0", + "camelcase-keys": "^6.2.2", + "decamelize": "^1.2.0", + "decamelize-keys": "^1.1.0", + "hard-rejection": "^2.1.0", + "minimist-options": "4.1.0", + "normalize-package-data": "^3.0.0", + "read-pkg-up": "^7.0.1", + "redent": "^3.0.0", + "trim-newlines": "^3.0.0", + "type-fest": "^0.18.0", + "yargs-parser": "^20.2.3" + }, + "dependencies": { + "type-fest": { + "version": "0.18.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", + "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==" + } + } + }, + "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==", + "requires": { + "hosted-git-info": "^4.0.1", + "is-core-module": "^2.5.0", + "semver": "^7.3.4", + "validate-npm-package-license": "^3.0.1" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "requires": { + "p-try": "^2.0.0" + } + }, + "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==", + "requires": { + "p-limit": "^2.2.0" + } + }, + "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==", + "requires": { + "@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" + } + }, + "read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "requires": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "dependencies": { + "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==" + }, + "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==", + "requires": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==" + }, + "type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==" + } + } + }, + "read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "requires": { + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" + } + }, + "redent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", + "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", + "requires": { + "indent-string": "^4.0.0", + "strip-indent": "^3.0.0" + } + }, + "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==", + "requires": { + "lru-cache": "^6.0.0" + } + }, + "strip-indent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", + "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", + "requires": { + "min-indent": "^1.0.0" + } + }, + "trim-newlines": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz", + "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==" + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + } + } + }, "ethers": { "version": "5.5.4", "resolved": "https://registry.npmjs.org/ethers/-/ethers-5.5.4.tgz", @@ -13976,6 +17153,22 @@ "@ethersproject/wordlists": "5.5.0" } }, + "ethjs-unit": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/ethjs-unit/-/ethjs-unit-0.1.6.tgz", + "integrity": "sha512-/Sn9Y0oKl0uqQuvgFk/zQgR7aw1g36qX/jzSQ5lSwlO0GigPymk4eGQfeNTD03w1dPOqfz8V77Cy43jH56pagw==", + "requires": { + "bn.js": "4.11.6", + "number-to-bn": "1.7.0" + }, + "dependencies": { + "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==" + } + } + }, "event-stream": { "version": "3.3.4", "resolved": "https://registry.npmjs.org/event-stream/-/event-stream-3.3.4.tgz", @@ -14473,10 +17666,9 @@ "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" }, "get-func-name": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", - "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=", - "dev": true + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz", + "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==" }, "get-intrinsic": { "version": "1.1.1", @@ -14588,6 +17780,11 @@ "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", "dev": true }, + "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==" + }, "has": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", @@ -14599,8 +17796,7 @@ "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" }, "has-symbols": { "version": "1.0.2", @@ -14937,6 +18133,11 @@ "is-extglob": "^1.0.0" } }, + "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==" + }, "is-lower-case": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/is-lower-case/-/is-lower-case-1.1.3.tgz", @@ -15096,8 +18297,7 @@ "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 + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" }, "js-yaml": { "version": "4.0.0", @@ -15114,6 +18314,11 @@ } } }, + "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==" + }, "json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", @@ -15254,6 +18459,11 @@ "resolved": "https://registry.npmjs.org/limiter/-/limiter-1.1.5.tgz", "integrity": "sha512-FWWMIEOxz3GwUI4Ts/IvgVy6LPvoMPgjMdQ185nN6psJyBJ4yOpzqm695/h5umdLJg2vW3GR5iG11MAkR2AzJA==" }, + "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==" + }, "load-json-file": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", @@ -15389,6 +18599,14 @@ "signal-exit": "^3.0.0" } }, + "loupe": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.7.tgz", + "integrity": "sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==", + "requires": { + "get-func-name": "^2.0.1" + } + }, "lower-case": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz", @@ -15454,8 +18672,7 @@ "map-obj": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", - "dev": true + "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=" }, "map-stream": { "version": "0.1.0", @@ -15522,11 +18739,28 @@ "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", "dev": true }, + "merkletreejs": { + "version": "0.3.11", + "resolved": "https://registry.npmjs.org/merkletreejs/-/merkletreejs-0.3.11.tgz", + "integrity": "sha512-LJKTl4iVNTndhL+3Uz/tfkjD0klIWsHlUzgtuNnNrsf7bAlXR30m+xYB7lHr5Z/l6e/yAIsr26Dabx6Buo4VGQ==", + "requires": { + "bignumber.js": "^9.0.1", + "buffer-reverse": "^1.0.1", + "crypto-js": "^4.2.0", + "treeify": "^1.1.0", + "web3-utils": "^1.3.4" + } + }, "methods": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" }, + "micro-ftch": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/micro-ftch/-/micro-ftch-0.3.1.tgz", + "integrity": "sha512-/0LLxhzP0tfiR5hcQebtudP56gUurs2CLkGarnCiB/OqEyUFQ6U3paQi/tgLv0hBJYt2rnr9MNpxz4fiiugstg==" + }, "micromatch": { "version": "2.3.11", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", @@ -15571,6 +18805,11 @@ "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", "dev": true }, + "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==" + }, "minimalistic-assert": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", @@ -15594,6 +18833,28 @@ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" }, + "minimist-options": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz", + "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==", + "requires": { + "arrify": "^1.0.1", + "is-plain-obj": "^1.1.0", + "kind-of": "^6.0.3" + }, + "dependencies": { + "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==" + }, + "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==" + } + } + }, "minipass": { "version": "3.1.6", "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.6.tgz", @@ -16450,6 +19711,22 @@ "set-blocking": "^2.0.0" } }, + "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==", + "requires": { + "bn.js": "4.11.6", + "strip-hex-prefix": "1.0.0" + }, + "dependencies": { + "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==" + } + } + }, "object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -16603,8 +19880,7 @@ "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 + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" }, "pako": { "version": "2.0.4", @@ -16678,8 +19954,7 @@ "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 + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" }, "path-is-absolute": { "version": "1.0.1", @@ -16711,8 +19986,7 @@ "pathval": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", - "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", - "dev": true + "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==" }, "pause-stream": { "version": "0.0.11", @@ -16847,6 +20121,11 @@ "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", "dev": true }, + "quick-lru": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", + "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==" + }, "randomatic": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.1.1.tgz", @@ -16873,7 +20152,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, "requires": { "safe-buffer": "^5.1.0" } @@ -17429,6 +20707,21 @@ "glob": "^7.1.3" } }, + "rlp": { + "version": "2.2.7", + "resolved": "https://registry.npmjs.org/rlp/-/rlp-2.2.7.tgz", + "integrity": "sha512-d5gdPmgQ0Z+AklL2NVXr/IoSjNZFfTVvQWzL/AM2AOcSzYP2xjlb0AC8YyCLc41MSNf6P6QVtjgPdmVtzb+4lQ==", + "requires": { + "bn.js": "^5.2.0" + }, + "dependencies": { + "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==" + } + } + }, "rosie": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/rosie/-/rosie-2.1.0.tgz", @@ -17905,7 +21198,6 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", - "dev": true, "requires": { "spdx-expression-parse": "^3.0.0", "spdx-license-ids": "^3.0.0" @@ -17914,14 +21206,12 @@ "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==", - "dev": true + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==" }, "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==", - "dev": true, "requires": { "spdx-exceptions": "^2.1.0", "spdx-license-ids": "^3.0.0" @@ -17930,8 +21220,7 @@ "spdx-license-ids": { "version": "3.0.11", "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.11.tgz", - "integrity": "sha512-Ctl2BrFiM0X3MANYgj3CkygxhRmr9mi6xhejbdO960nF6EDJApTYpn0BQnDKlnNBULKiCN1n3w9EBkHK8ZWg+g==", - "dev": true + "integrity": "sha512-Ctl2BrFiM0X3MANYgj3CkygxhRmr9mi6xhejbdO960nF6EDJApTYpn0BQnDKlnNBULKiCN1n3w9EBkHK8ZWg+g==" }, "split": { "version": "0.3.3", @@ -18077,6 +21366,14 @@ "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", "dev": true }, + "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==", + "requires": { + "is-hex-prefixed": "1.0.0" + } + }, "strip-indent": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", @@ -18236,7 +21533,6 @@ "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, "requires": { "has-flag": "^3.0.0" } @@ -18417,6 +21713,11 @@ "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", "dev": true }, + "treeify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/treeify/-/treeify-1.1.0.tgz", + "integrity": "sha512-1m4RA7xVAJrSGrrXGs0L3YTwyvBs2S8PbRHaLZAkFw7JR8oIFwYtysxlBZhYIa7xSyiYJKZ3iGrrk55cGA3i9A==" + }, "trim-newlines": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", @@ -18758,8 +22059,7 @@ "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==", - "dev": true + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==" }, "type-fest": { "version": "0.8.1", @@ -18879,6 +22179,11 @@ "node-gyp-build": "^4.3.0" } }, + "utf8": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/utf8/-/utf8-3.0.0.tgz", + "integrity": "sha512-E8VjFIQ/TyQgp+TZfS6l8yp/xWppSAHzidGiRrqe4bK4XP9pTRyKFgGJpO3SN7zdX4DeomTrwaseCHovfpFcqQ==" + }, "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -18913,7 +22218,6 @@ "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==", - "dev": true, "requires": { "spdx-correct": "^3.0.0", "spdx-expression-parse": "^3.0.0" @@ -18937,6 +22241,28 @@ "rxjs": "^6.6.3" } }, + "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==", + "requires": { + "@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" + }, + "dependencies": { + "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==" + } + } + }, "webidl-conversions": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", diff --git a/package.json b/package.json index 3b2b47fa..281abcb9 100644 --- a/package.json +++ b/package.json @@ -1,10 +1,13 @@ { "name": "sanctuary", - "version": "5.8.0", + "version": "5.9.0-beta.1", "repository": { "type": "git", "url": "git+https://github.com/umbrella-network/sanctuary.git" }, + "engines": { + "node": ">=18.0.0" + }, "license": "MIT", "scripts": { "lint": "eslint ./src/**/*.ts ./test/**/*.ts --max-warnings=0", @@ -81,6 +84,7 @@ "@project-serum/anchor": "~0.23.0", "@solana/web3.js": "~1.36.0", "@umb-network/toolbox": "~5.10.0", + "@eth-optimism/sdk": "~3.1.8", "auth0": "^2.37.0", "axios": "~0.21.1", "bcrypt": "~5.0.0", @@ -92,6 +96,7 @@ "date-fns": "^2.22.1", "dotenv": "~8.2.0", "ethers": "~5.5.1", + "ethereum-input-data-decoder": "~0.4.2", "express": "~4.17.1", "express-async-errors": "^3.1.1", "express-jwt": "^6.1.0", diff --git a/src/config/settings.ts b/src/config/settings.ts index b9d32bb5..c16d4678 100644 --- a/src/config/settings.ts +++ b/src/config/settings.ts @@ -11,7 +11,7 @@ const settings: Settings = { lockTTL: parseInt(process.env.BLOCK_CREATION_LOCK_TTL || '20000'), }, metricsReporting: { - interval: parseInt(process.env.METRICS_REPORTING_JOB_INTERVAL || '300000', 10), + interval: parseInt(process.env.METRICS_REPORTING_JOB_INTERVAL || '60000', 10), }, chainsWorkerSchedulerSettings: { bsc: { @@ -44,6 +44,9 @@ const settings: Settings = { blockSyncBatchSize: parseInt(process.env.BLOCK_SYNC_BATCH_SIZE || '5', 10), feedsFile: process.env.FEEDS_FILE || '', feedsOnChain: process.env.FEEDS_ON_CHAIN_FILE || '', + layer1FeedFile: + process.env.LAYER_FEEDS_FILE || + 'https://raw.githubusercontent.com/umbrella-network/pegasus-feeds/main/prod/onChainData128.8.yaml', }, blockchain: { contracts: { @@ -59,6 +62,17 @@ const settings: Settings = { chainId: 'bsc', replicationConfirmations: parseInt(process.env.HOME_REPLICATION_CONFIRMATIONS || '20', 10), }, + blockchainScanner: { + arbitrum: { + startBlockNumber: parseInt(process.env.ARBITRUM_SCANNER_START_BLOCK_NUMBER || '0', 10), + scanBatchSize: parseInt(process.env.ARBITRUM_BLOCK_SCAN_BATCH_SIZE || '1000', 10), + fetchBlocksBatchSize: parseInt(process.env.ARBITRUM_SCANNER_FETCH_BLOCKS_BATCH || '100', 10), + maxRequestConcurrency: parseInt(process.env.ARBITRUM_MAX_REQUEST_CONCURRENCY || '10', 10), + confirmations: parseInt(process.env.ARBITRUM_BLOCK_CONFIRMATIONS || '5', 10), + providerUrl: process.env.ARBITRUM_SCANNER_PROVIDER_URL, // we can't have default providers set up + contractRegistryAddress: process.env.ARBITRUM_REGISTRY_CONTRACT_ADDRESS, + }, + }, multiChains: { bsc: { startBlockNumber: parseInt(process.env.START_BLOCK_NUMBER || '-100000', 10), @@ -69,7 +83,6 @@ const settings: Settings = { contractRegistryAddress: process.env.REGISTRY_CONTRACT_ADDRESS, }, ethereum: { - registryScannerStartingBlock: parseInt(process.env.ETH_REGISTRY_SCAN_START_BLOCK_NUMBER || '0', 10), startBlockNumber: parseInt(process.env.ETH_START_BLOCK_NUMBER || '-100000', 10), scanBatchSize: parseInt(process.env.ETH_BLOCK_SCAN_BATCH_SIZE || '1000', 10), maxRequestConcurrency: parseInt(process.env.ETH_MAX_REQUEST_CONCURRENCY || '10', 10), @@ -78,7 +91,6 @@ const settings: Settings = { contractRegistryAddress: process.env.ETH_REGISTRY_CONTRACT_ADDRESS, }, polygon: { - registryScannerStartingBlock: parseInt(process.env.POLYGON_REGISTRY_SCAN_START_BLOCK_NUMBER || '0', 10), startBlockNumber: parseInt(process.env.POLYGON_START_BLOCK_NUMBER || '-100000', 10), scanBatchSize: Math.min(1000, parseInt(process.env.POLYGON_BLOCK_SCAN_BATCH_SIZE || '1000', 10)), maxRequestConcurrency: parseInt(process.env.POLYGON_MAX_REQUEST_CONCURRENCY || '10', 10), @@ -87,7 +99,6 @@ const settings: Settings = { contractRegistryAddress: process.env.POLYGON_REGISTRY_CONTRACT_ADDRESS, }, avax: { - registryScannerStartingBlock: parseInt(process.env.AVALANCHE_REGISTRY_SCAN_START_BLOCK_NUMBER || '0', 10), startBlockNumber: parseInt(process.env.AVALANCHE_START_BLOCK_NUMBER || '-100000', 10), scanBatchSize: Math.min(2000, parseInt(process.env.AVALANCHE_BLOCK_SCAN_BATCH_SIZE || '2000', 10)), maxRequestConcurrency: parseInt(process.env.AVALANCHE_MAX_REQUEST_CONCURRENCY || '10', 10), @@ -96,7 +107,6 @@ const settings: Settings = { contractRegistryAddress: process.env.AVALANCHE_REGISTRY_CONTRACT_ADDRESS, }, arbitrum: { - registryScannerStartingBlock: parseInt(process.env.ARBITRUM_REGISTRY_SCAN_START_BLOCK_NUMBER || '0', 10), startBlockNumber: parseInt(process.env.ARBITRUM_START_BLOCK_NUMBER || '-100000', 10), scanBatchSize: parseInt(process.env.ARBITRUM_BLOCK_SCAN_BATCH_SIZE || '1000', 10), maxRequestConcurrency: parseInt(process.env.ARBITRUM_MAX_REQUEST_CONCURRENCY || '10', 10), diff --git a/src/contracts/UmbrellaFeeds.json b/src/contracts/UmbrellaFeeds.json new file mode 100644 index 00000000..a89700c0 --- /dev/null +++ b/src/contracts/UmbrellaFeeds.json @@ -0,0 +1,943 @@ +{ + "address": "0xD12EbD0892BC812218688Dcd90DD6FE160aE092A", + "abi": [ + { + "inputs": [ + { + "internalType": "contract IRegistry", + "name": "_contractRegistry", + "type": "address" + }, + { + "internalType": "uint16", + "name": "_requiredSignatures", + "type": "uint16" + }, + { + "internalType": "uint8", + "name": "_decimals", + "type": "uint8" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [], + "name": "ArraysDataDoNotMatch", + "type": "error" + }, + { + "inputs": [], + "name": "ContractInUse", + "type": "error" + }, + { + "inputs": [], + "name": "ContractNotInitialised", + "type": "error" + }, + { + "inputs": [], + "name": "ECDSAInvalidSignatureS", + "type": "error" + }, + { + "inputs": [], + "name": "ECDSAInvalidSignatureV", + "type": "error" + }, + { + "inputs": [], + "name": "FeedNotExist", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidRequiredSignatures", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidSigner", + "type": "error" + }, + { + "inputs": [], + "name": "NotEnoughSignatures", + "type": "error" + }, + { + "inputs": [], + "name": "OldData", + "type": "error" + }, + { + "inputs": [], + "name": "SignaturesOutOfOrder", + "type": "error" + }, + { + "inputs": [], + "name": "DECIMALS", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "DEPLOYED_AT", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "ETH_PREFIX", + "outputs": [ + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "NAME", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "REGISTRY", + "outputs": [ + { + "internalType": "contract IRegistry", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "REQUIRED_SIGNATURES", + "outputs": [ + { + "internalType": "uint16", + "name": "", + "type": "uint16" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "STAKING_BANK", + "outputs": [ + { + "internalType": "contract IStakingBankStatic", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "_name", + "type": "string" + } + ], + "name": "destroy", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "getChainId", + "outputs": [ + { + "internalType": "uint256", + "name": "id", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32[]", + "name": "_keys", + "type": "bytes32[]" + } + ], + "name": "getManyPriceData", + "outputs": [ + { + "components": [ + { + "internalType": "uint8", + "name": "data", + "type": "uint8" + }, + { + "internalType": "uint24", + "name": "heartbeat", + "type": "uint24" + }, + { + "internalType": "uint32", + "name": "timestamp", + "type": "uint32" + }, + { + "internalType": "uint128", + "name": "price", + "type": "uint128" + } + ], + "internalType": "struct IUmbrellaFeeds.PriceData[]", + "name": "data", + "type": "tuple[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32[]", + "name": "_keys", + "type": "bytes32[]" + } + ], + "name": "getManyPriceDataRaw", + "outputs": [ + { + "components": [ + { + "internalType": "uint8", + "name": "data", + "type": "uint8" + }, + { + "internalType": "uint24", + "name": "heartbeat", + "type": "uint24" + }, + { + "internalType": "uint32", + "name": "timestamp", + "type": "uint32" + }, + { + "internalType": "uint128", + "name": "price", + "type": "uint128" + } + ], + "internalType": "struct IUmbrellaFeeds.PriceData[]", + "name": "data", + "type": "tuple[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getName", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_key", + "type": "bytes32" + } + ], + "name": "getPrice", + "outputs": [ + { + "internalType": "uint128", + "name": "price", + "type": "uint128" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_key", + "type": "bytes32" + } + ], + "name": "getPriceData", + "outputs": [ + { + "components": [ + { + "internalType": "uint8", + "name": "data", + "type": "uint8" + }, + { + "internalType": "uint24", + "name": "heartbeat", + "type": "uint24" + }, + { + "internalType": "uint32", + "name": "timestamp", + "type": "uint32" + }, + { + "internalType": "uint128", + "name": "price", + "type": "uint128" + } + ], + "internalType": "struct IUmbrellaFeeds.PriceData", + "name": "data", + "type": "tuple" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "_name", + "type": "string" + } + ], + "name": "getPriceDataByName", + "outputs": [ + { + "components": [ + { + "internalType": "uint8", + "name": "data", + "type": "uint8" + }, + { + "internalType": "uint24", + "name": "heartbeat", + "type": "uint24" + }, + { + "internalType": "uint32", + "name": "timestamp", + "type": "uint32" + }, + { + "internalType": "uint128", + "name": "price", + "type": "uint128" + } + ], + "internalType": "struct IUmbrellaFeeds.PriceData", + "name": "data", + "type": "tuple" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_key", + "type": "bytes32" + } + ], + "name": "getPriceTimestamp", + "outputs": [ + { + "internalType": "uint128", + "name": "price", + "type": "uint128" + }, + { + "internalType": "uint32", + "name": "timestamp", + "type": "uint32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_key", + "type": "bytes32" + } + ], + "name": "getPriceTimestampHeartbeat", + "outputs": [ + { + "internalType": "uint128", + "name": "price", + "type": "uint128" + }, + { + "internalType": "uint32", + "name": "timestamp", + "type": "uint32" + }, + { + "internalType": "uint24", + "name": "heartbeat", + "type": "uint24" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32[]", + "name": "_priceKeys", + "type": "bytes32[]" + }, + { + "components": [ + { + "internalType": "uint8", + "name": "data", + "type": "uint8" + }, + { + "internalType": "uint24", + "name": "heartbeat", + "type": "uint24" + }, + { + "internalType": "uint32", + "name": "timestamp", + "type": "uint32" + }, + { + "internalType": "uint128", + "name": "price", + "type": "uint128" + } + ], + "internalType": "struct IUmbrellaFeeds.PriceData[]", + "name": "_priceDatas", + "type": "tuple[]" + } + ], + "name": "hashData", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_key", + "type": "bytes32" + } + ], + "name": "prices", + "outputs": [ + { + "components": [ + { + "internalType": "uint8", + "name": "data", + "type": "uint8" + }, + { + "internalType": "uint24", + "name": "heartbeat", + "type": "uint24" + }, + { + "internalType": "uint32", + "name": "timestamp", + "type": "uint32" + }, + { + "internalType": "uint128", + "name": "price", + "type": "uint128" + } + ], + "internalType": "struct IUmbrellaFeeds.PriceData", + "name": "data", + "type": "tuple" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_hash", + "type": "bytes32" + }, + { + "internalType": "uint8", + "name": "_v", + "type": "uint8" + }, + { + "internalType": "bytes32", + "name": "_r", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "_s", + "type": "bytes32" + } + ], + "name": "recoverSigner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32[]", + "name": "_priceKeys", + "type": "bytes32[]" + }, + { + "components": [ + { + "internalType": "uint8", + "name": "data", + "type": "uint8" + }, + { + "internalType": "uint24", + "name": "heartbeat", + "type": "uint24" + }, + { + "internalType": "uint32", + "name": "timestamp", + "type": "uint32" + }, + { + "internalType": "uint128", + "name": "price", + "type": "uint128" + } + ], + "internalType": "struct IUmbrellaFeeds.PriceData[]", + "name": "_priceDatas", + "type": "tuple[]" + }, + { + "components": [ + { + "internalType": "uint8", + "name": "v", + "type": "uint8" + }, + { + "internalType": "bytes32", + "name": "r", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "s", + "type": "bytes32" + } + ], + "internalType": "struct IUmbrellaFeeds.Signature[]", + "name": "_signatures", + "type": "tuple[]" + } + ], + "name": "update", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_hash", + "type": "bytes32" + }, + { + "components": [ + { + "internalType": "uint8", + "name": "v", + "type": "uint8" + }, + { + "internalType": "bytes32", + "name": "r", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "s", + "type": "bytes32" + } + ], + "internalType": "struct IUmbrellaFeeds.Signature[]", + "name": "_signatures", + "type": "tuple[]" + } + ], + "name": "verifySignatures", + "outputs": [], + "stateMutability": "view", + "type": "function" + } + ], + "transactionHash": "0x02f3c690e58d41c34d7ef693dba6efd122205ff62d4ed80f7e09bc6540c0008f", + "receipt": { + "to": null, + "from": "0xA6e4fFa19B213AbeA258ae72e8e1a209B9E543e7", + "contractAddress": "0xD12EbD0892BC812218688Dcd90DD6FE160aE092A", + "transactionIndex": 1, + "gasUsed": "2533763", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "blockHash": "0xed3d7de17496ffc8cb0d0fba5aa5ddf2bfe6298614f31864c59294cc4b01aa53", + "transactionHash": "0x02f3c690e58d41c34d7ef693dba6efd122205ff62d4ed80f7e09bc6540c0008f", + "logs": [], + "blockNumber": 2141372, + "cumulativeGasUsed": "2580676", + "status": 1, + "byzantium": true + }, + "args": [ + "0x6fC13EACE26590B80cCCAB1ba5d51890577D83B2", + 6, + 8 + ], + "numDeployments": 1, + "solcInputHash": "58dc0a40b9cbc64184cc065828610117", + "metadata": "{\"compiler\":{\"version\":\"0.8.13+commit.abaa5c0e\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract IRegistry\",\"name\":\"_contractRegistry\",\"type\":\"address\"},{\"internalType\":\"uint16\",\"name\":\"_requiredSignatures\",\"type\":\"uint16\"},{\"internalType\":\"uint8\",\"name\":\"_decimals\",\"type\":\"uint8\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"ArraysDataDoNotMatch\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ContractInUse\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ContractNotInitialised\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ECDSAInvalidSignatureS\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ECDSAInvalidSignatureV\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FeedNotExist\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidRequiredSignatures\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidSigner\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NotEnoughSignatures\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OldData\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"SignaturesOutOfOrder\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"DECIMALS\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"DEPLOYED_AT\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ETH_PREFIX\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"NAME\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"REGISTRY\",\"outputs\":[{\"internalType\":\"contract IRegistry\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"REQUIRED_SIGNATURES\",\"outputs\":[{\"internalType\":\"uint16\",\"name\":\"\",\"type\":\"uint16\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"STAKING_BANK\",\"outputs\":[{\"internalType\":\"contract IStakingBankStatic\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"destroy\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getChainId\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32[]\",\"name\":\"_keys\",\"type\":\"bytes32[]\"}],\"name\":\"getManyPriceData\",\"outputs\":[{\"components\":[{\"internalType\":\"uint8\",\"name\":\"data\",\"type\":\"uint8\"},{\"internalType\":\"uint24\",\"name\":\"heartbeat\",\"type\":\"uint24\"},{\"internalType\":\"uint32\",\"name\":\"timestamp\",\"type\":\"uint32\"},{\"internalType\":\"uint128\",\"name\":\"price\",\"type\":\"uint128\"}],\"internalType\":\"struct IUmbrellaFeeds.PriceData[]\",\"name\":\"data\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32[]\",\"name\":\"_keys\",\"type\":\"bytes32[]\"}],\"name\":\"getManyPriceDataRaw\",\"outputs\":[{\"components\":[{\"internalType\":\"uint8\",\"name\":\"data\",\"type\":\"uint8\"},{\"internalType\":\"uint24\",\"name\":\"heartbeat\",\"type\":\"uint24\"},{\"internalType\":\"uint32\",\"name\":\"timestamp\",\"type\":\"uint32\"},{\"internalType\":\"uint128\",\"name\":\"price\",\"type\":\"uint128\"}],\"internalType\":\"struct IUmbrellaFeeds.PriceData[]\",\"name\":\"data\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getName\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_key\",\"type\":\"bytes32\"}],\"name\":\"getPrice\",\"outputs\":[{\"internalType\":\"uint128\",\"name\":\"price\",\"type\":\"uint128\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_key\",\"type\":\"bytes32\"}],\"name\":\"getPriceData\",\"outputs\":[{\"components\":[{\"internalType\":\"uint8\",\"name\":\"data\",\"type\":\"uint8\"},{\"internalType\":\"uint24\",\"name\":\"heartbeat\",\"type\":\"uint24\"},{\"internalType\":\"uint32\",\"name\":\"timestamp\",\"type\":\"uint32\"},{\"internalType\":\"uint128\",\"name\":\"price\",\"type\":\"uint128\"}],\"internalType\":\"struct IUmbrellaFeeds.PriceData\",\"name\":\"data\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"getPriceDataByName\",\"outputs\":[{\"components\":[{\"internalType\":\"uint8\",\"name\":\"data\",\"type\":\"uint8\"},{\"internalType\":\"uint24\",\"name\":\"heartbeat\",\"type\":\"uint24\"},{\"internalType\":\"uint32\",\"name\":\"timestamp\",\"type\":\"uint32\"},{\"internalType\":\"uint128\",\"name\":\"price\",\"type\":\"uint128\"}],\"internalType\":\"struct IUmbrellaFeeds.PriceData\",\"name\":\"data\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_key\",\"type\":\"bytes32\"}],\"name\":\"getPriceTimestamp\",\"outputs\":[{\"internalType\":\"uint128\",\"name\":\"price\",\"type\":\"uint128\"},{\"internalType\":\"uint32\",\"name\":\"timestamp\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_key\",\"type\":\"bytes32\"}],\"name\":\"getPriceTimestampHeartbeat\",\"outputs\":[{\"internalType\":\"uint128\",\"name\":\"price\",\"type\":\"uint128\"},{\"internalType\":\"uint32\",\"name\":\"timestamp\",\"type\":\"uint32\"},{\"internalType\":\"uint24\",\"name\":\"heartbeat\",\"type\":\"uint24\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32[]\",\"name\":\"_priceKeys\",\"type\":\"bytes32[]\"},{\"components\":[{\"internalType\":\"uint8\",\"name\":\"data\",\"type\":\"uint8\"},{\"internalType\":\"uint24\",\"name\":\"heartbeat\",\"type\":\"uint24\"},{\"internalType\":\"uint32\",\"name\":\"timestamp\",\"type\":\"uint32\"},{\"internalType\":\"uint128\",\"name\":\"price\",\"type\":\"uint128\"}],\"internalType\":\"struct IUmbrellaFeeds.PriceData[]\",\"name\":\"_priceDatas\",\"type\":\"tuple[]\"}],\"name\":\"hashData\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_key\",\"type\":\"bytes32\"}],\"name\":\"prices\",\"outputs\":[{\"components\":[{\"internalType\":\"uint8\",\"name\":\"data\",\"type\":\"uint8\"},{\"internalType\":\"uint24\",\"name\":\"heartbeat\",\"type\":\"uint24\"},{\"internalType\":\"uint32\",\"name\":\"timestamp\",\"type\":\"uint32\"},{\"internalType\":\"uint128\",\"name\":\"price\",\"type\":\"uint128\"}],\"internalType\":\"struct IUmbrellaFeeds.PriceData\",\"name\":\"data\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_hash\",\"type\":\"bytes32\"},{\"internalType\":\"uint8\",\"name\":\"_v\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"_r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"_s\",\"type\":\"bytes32\"}],\"name\":\"recoverSigner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32[]\",\"name\":\"_priceKeys\",\"type\":\"bytes32[]\"},{\"components\":[{\"internalType\":\"uint8\",\"name\":\"data\",\"type\":\"uint8\"},{\"internalType\":\"uint24\",\"name\":\"heartbeat\",\"type\":\"uint24\"},{\"internalType\":\"uint32\",\"name\":\"timestamp\",\"type\":\"uint32\"},{\"internalType\":\"uint128\",\"name\":\"price\",\"type\":\"uint128\"}],\"internalType\":\"struct IUmbrellaFeeds.PriceData[]\",\"name\":\"_priceDatas\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint8\",\"name\":\"v\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"internalType\":\"struct IUmbrellaFeeds.Signature[]\",\"name\":\"_signatures\",\"type\":\"tuple[]\"}],\"name\":\"update\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_hash\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"uint8\",\"name\":\"v\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"internalType\":\"struct IUmbrellaFeeds.Signature[]\",\"name\":\"_signatures\",\"type\":\"tuple[]\"}],\"name\":\"verifySignatures\",\"outputs\":[],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"Main contract for all on-chain data. Check `UmbrellaFeedsReader` to see how to integrate.\",\"kind\":\"dev\",\"methods\":{\"constructor\":{\"params\":{\"_contractRegistry\":\"Registry address\",\"_decimals\":\"decimals for prices stored in this contract\",\"_requiredSignatures\":\"number of required signatures for accepting consensus submission\"}},\"destroy(string)\":{\"details\":\"destroys old contract there is sanity check that prevents abuse of destroy method\",\"params\":{\"_name\":\"string feed key to verify, that contract was initialised\"}},\"getManyPriceData(bytes32[])\":{\"details\":\"it will return array of price datas for provided `_keys` In case ony of feed does not exist, fallback call will be executed for that feed.\",\"params\":{\"_keys\":\"array of feed keys\"},\"returns\":{\"data\":\"PriceData array\"}},\"getManyPriceDataRaw(bytes32[])\":{\"details\":\"same as getManyPriceData() but does not revert on empty data.\"},\"getName()\":{\"details\":\"to follow Registrable interface\"},\"getPrice(bytes32)\":{\"params\":{\"_key\":\"hash of feed name\"},\"returns\":{\"price\":\"price\"}},\"getPriceData(bytes32)\":{\"details\":\"this is main endpoint for reading feeds. In case timestamp is empty (that means there is no data), contract will revert. If you do not need whole data from `PriceData` struct, you can save some gas by using other view methods that returns just what you need.\",\"params\":{\"_key\":\"hash of feed name\"},\"returns\":{\"data\":\"full PriceData struct\"}},\"getPriceDataByName(string)\":{\"details\":\"This method should be used only for Layer2 as it is more gas consuming than others views.\",\"params\":{\"_name\":\"string feed name\"},\"returns\":{\"data\":\"PriceData\"}},\"getPriceTimestamp(bytes32)\":{\"params\":{\"_key\":\"hash of feed name\"},\"returns\":{\"price\":\"price\",\"timestamp\":\"timestamp\"}},\"getPriceTimestampHeartbeat(bytes32)\":{\"params\":{\"_key\":\"hash of feed name\"},\"returns\":{\"heartbeat\":\"heartbeat\",\"price\":\"price\",\"timestamp\":\"timestamp\"}},\"hashData(bytes32[],(uint8,uint24,uint32,uint128)[])\":{\"details\":\"helper method for QA purposes\",\"returns\":{\"_0\":\"hash of data that are signed by validators (keys and priced data)\"}},\"prices(bytes32)\":{\"params\":{\"_key\":\"hash of feed name\"},\"returns\":{\"data\":\"full PriceData struct\"}},\"recoverSigner(bytes32,uint8,bytes32,bytes32)\":{\"params\":{\"_hash\":\"hashed of data\",\"_r\":\"part of signature\",\"_s\":\"part of signature\",\"_v\":\"part of signature\"},\"returns\":{\"_0\":\"signer address\"}},\"update(bytes32[],(uint8,uint24,uint32,uint128)[],(uint8,bytes32,bytes32)[])\":{\"details\":\"method for submitting consensus data\",\"params\":{\"_priceDatas\":\"PriceData signed by validators\",\"_priceKeys\":\"array of keys for `_priceDatas`\",\"_signatures\":\"validators signatures\"}},\"verifySignatures(bytes32,(uint8,bytes32,bytes32)[])\":{\"params\":{\"_hash\":\"hash of signed data\",\"_signatures\":\"array of validators signatures\"}}},\"stateVariables\":{\"DECIMALS\":{\"details\":\"decimals for prices stored in this contract\"},\"DEPLOYED_AT\":{\"details\":\"deployment time, used for protect for unintentional destroy\"},\"REGISTRY\":{\"details\":\"Registry contract where list of all addresses is stored. Fallback feature uses this registry to resolve newest `UmbrellaFeeds` address\"},\"REQUIRED_SIGNATURES\":{\"details\":\"minimal number of signatures required for accepting price submission (PoA)\"},\"STAKING_BANK\":{\"details\":\"StakingBank contract where list of validators is stored\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"getManyPriceData(bytes32[])\":{\"notice\":\"If data for any key not exists, function will revert. Use `getManyPriceDataRaw` method if you don't want revert.\"},\"getManyPriceDataRaw(bytes32[])\":{\"notice\":\"This method does no revert if some data does not exists. Check `data.timestamp` to see if price exist, if it is 0, then it does not exist.\"},\"getPrice(bytes32)\":{\"notice\":\"method will revert if data for `_key` not exists.\"},\"getPriceData(bytes32)\":{\"notice\":\"method will revert if data for `_key` not exists.\"},\"getPriceDataByName(string)\":{\"notice\":\"It does not revert on empty data.\"},\"getPriceTimestamp(bytes32)\":{\"notice\":\"method will revert if data for `_key` not exists.\"},\"getPriceTimestampHeartbeat(bytes32)\":{\"notice\":\"method will revert if data for `_key` not exists.\"},\"prices(bytes32)\":{\"notice\":\"reader for mapping\"}},\"notice\":\"This contract can be destroyed and replaced with new one (with new address). For best gas efficiency you should pick one of two ways of integration: 1. make `UmbrellaFeeds` immutable and use fallback in case of selfdestruct. After new deployment, it is recommended to update address to avoid fallback and reduce gas cost to minimum. In long run this is most efficient solution, better than any proxy. 2. always check newest `UmbrellaFeeds` via `Regostry` and fallback will not be needed.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/onChainFeeds/UmbrellaFeeds.sol\":\"UmbrellaFeeds\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":false,\"runs\":0},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/token/ERC20/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC20 standard as defined in the EIP.\\n */\\ninterface IERC20 {\\n /**\\n * @dev Emitted when `value` tokens are moved from one account (`from`) to\\n * another (`to`).\\n *\\n * Note that `value` may be zero.\\n */\\n event Transfer(address indexed from, address indexed to, uint256 value);\\n\\n /**\\n * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\n * a call to {approve}. `value` is the new allowance.\\n */\\n event Approval(address indexed owner, address indexed spender, uint256 value);\\n\\n /**\\n * @dev Returns the amount of tokens in existence.\\n */\\n function totalSupply() external view returns (uint256);\\n\\n /**\\n * @dev Returns the amount of tokens owned by `account`.\\n */\\n function balanceOf(address account) external view returns (uint256);\\n\\n /**\\n * @dev Moves `amount` tokens from the caller's account to `to`.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * Emits a {Transfer} event.\\n */\\n function transfer(address to, uint256 amount) external returns (bool);\\n\\n /**\\n * @dev Returns the remaining number of tokens that `spender` will be\\n * allowed to spend on behalf of `owner` through {transferFrom}. This is\\n * zero by default.\\n *\\n * This value changes when {approve} or {transferFrom} are called.\\n */\\n function allowance(address owner, address spender) external view returns (uint256);\\n\\n /**\\n * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * IMPORTANT: Beware that changing an allowance with this method brings the risk\\n * that someone may use both the old and the new allowance by unfortunate\\n * transaction ordering. One possible solution to mitigate this race\\n * condition is to first reduce the spender's allowance to 0 and set the\\n * desired value afterwards:\\n * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n *\\n * Emits an {Approval} event.\\n */\\n function approve(address spender, uint256 amount) external returns (bool);\\n\\n /**\\n * @dev Moves `amount` tokens from `from` to `to` using the\\n * allowance mechanism. `amount` is then deducted from the caller's\\n * allowance.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * Emits a {Transfer} event.\\n */\\n function transferFrom(\\n address from,\\n address to,\\n uint256 amount\\n ) external returns (bool);\\n}\\n\",\"keccak256\":\"0x9750c6b834f7b43000631af5cc30001c5f547b3ceb3635488f140f60e897ea6b\",\"license\":\"MIT\"},\"contracts/interfaces/IRegistry.sol\":{\"content\":\"//SPDX-License-Identifier: MIT\\npragma solidity 0.8.13;\\n\\n\\ninterface IRegistry {\\n event LogRegistered(address indexed destination, bytes32 name);\\n\\n /// @dev imports new contract addresses and override old addresses, if they exist under provided name\\n /// This method can be used for contracts that for some reason do not have `getName` method\\n /// @param _names array of contract names that we want to register\\n /// @param _destinations array of contract addresses\\n function importAddresses(bytes32[] calldata _names, address[] calldata _destinations) external;\\n\\n /// @dev imports new contracts and override old addresses, if they exist.\\n /// Names of contracts are fetched directly from each contract by calling `getName`\\n /// @param _destinations array of contract addresses\\n function importContracts(address[] calldata _destinations) external;\\n\\n /// @dev this method ensure, that old and new contract is aware of it state in registry\\n /// Note: BSC registry does not have this method. This method was introduced in later stage.\\n /// @param _newContract address of contract that will replace old one\\n function atomicUpdate(address _newContract) external;\\n\\n /// @dev similar to `getAddress` but throws when contract name not exists\\n /// @param name contract name\\n /// @return contract address registered under provided name or throws, if does not exists\\n function requireAndGetAddress(bytes32 name) external view returns (address);\\n\\n /// @param name contract name in a form of bytes32\\n /// @return contract address registered under provided name\\n function getAddress(bytes32 name) external view returns (address);\\n\\n /// @param _name contract name\\n /// @return contract address assigned to the name or address(0) if not exists\\n function getAddressByString(string memory _name) external view returns (address);\\n\\n /// @dev helper method that converts string to bytes32,\\n /// you can use to to generate contract name\\n function stringToBytes32(string memory _string) external pure returns (bytes32 result);\\n}\\n\",\"keccak256\":\"0xa0099ecf4182138fda7a0733407784461410c245de67c1e7ba7cd7c9595e054f\",\"license\":\"MIT\"},\"contracts/interfaces/IStakingBank.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.13;\\n\\nimport \\\"@openzeppelin/contracts/token/ERC20/IERC20.sol\\\";\\n\\ninterface IStakingBank is IERC20 {\\n /// @param id address of validator wallet\\n /// @param location URL of the validator API\\n struct Validator {\\n address id;\\n string location;\\n }\\n\\n event LogValidatorRegistered(address indexed id);\\n event LogValidatorUpdated(address indexed id);\\n event LogValidatorRemoved(address indexed id);\\n event LogMinAmountForStake(uint256 minAmountForStake);\\n\\n /// @dev setter for `minAmountForStake`\\n function setMinAmountForStake(uint256 _minAmountForStake) external;\\n\\n /// @dev allows to stake `token` by validators\\n /// Validator needs to approve StakingBank beforehand\\n /// @param _value amount of tokens to stake\\n function stake(uint256 _value) external;\\n\\n /// @dev notification about approval from `_from` address on UMB token\\n /// Staking bank will stake max approved amount from `_from` address\\n /// @param _from address which approved token spend for IStakingBank\\n function receiveApproval(address _from) external returns (bool success);\\n\\n /// @dev withdraws stake tokens\\n /// it throws, when balance will be less than required minimum for stake\\n /// to withdraw all use `exit`\\n function withdraw(uint256 _value) external returns (bool success);\\n\\n /// @dev unstake and withdraw all tokens\\n function exit() external returns (bool success);\\n\\n /// @dev creates (register) new validator\\n /// @param _id validator address\\n /// @param _location location URL of the validator API\\n function create(address _id, string calldata _location) external;\\n\\n /// @dev removes validator\\n /// @param _id validator wallet\\n function remove(address _id) external;\\n\\n /// @dev updates validator location\\n /// @param _id validator wallet\\n /// @param _location new validator URL\\n function update(address _id, string calldata _location) external;\\n\\n /// @return total number of registered validators (with and without balance)\\n function getNumberOfValidators() external view returns (uint256);\\n\\n /// @dev gets validator address for provided index\\n /// @param _ix index in array of list of all validators wallets\\n function addresses(uint256 _ix) external view returns (address);\\n\\n /// @param _id address of validator\\n /// @return id address of validator\\n /// @return location URL of validator\\n function validators(address _id) external view returns (address id, string memory location);\\n}\\n\",\"keccak256\":\"0x2c518aeab8b0b3a364fafaec559d3ff0dc6a119f8d203fa31ef7ad667ca0f7b9\",\"license\":\"MIT\"},\"contracts/interfaces/IStakingBankStatic.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.13;\\n\\nimport \\\"./IStakingBank.sol\\\";\\n\\n\\ninterface IStakingBankStatic is IStakingBank {\\n /// @param _validators array of validators addresses to verify\\n /// @return TRUE when all validators are valid, FALSE otherwise\\n function verifyValidators(address[] calldata _validators) external view returns (bool);\\n}\\n\",\"keccak256\":\"0xb7829f090205357ae8c7b86490504897060650c149309362b95eacbeef88d8ba\",\"license\":\"MIT\"},\"contracts/interfaces/IUmbrellaFeeds.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\ninterface IUmbrellaFeeds {\\n struct PriceData {\\n /// @dev this is placeholder, that can be used for some additional data\\n /// atm of creating this smart contract, it is only used as marker for removed data (when == type(uint8).max)\\n uint8 data;\\n /// @dev heartbeat: how often price data will be refreshed in case price stay flat\\n uint24 heartbeat;\\n /// @dev timestamp: price time, at this time validators run consensus\\n uint32 timestamp;\\n /// @dev price\\n uint128 price;\\n }\\n\\n struct Signature {\\n uint8 v;\\n bytes32 r;\\n bytes32 s;\\n }\\n\\n /// @dev method for submitting consensus data\\n /// @param _priceKeys array of keys for `_priceDatas`\\n /// @param _priceDatas PriceData signed by validators\\n /// @param _signatures validators signatures\\n function update(\\n bytes32[] calldata _priceKeys,\\n PriceData[] calldata _priceDatas,\\n Signature[] calldata _signatures\\n ) external;\\n\\n /// @dev it will return array of price datas for provided `_keys`\\n /// In case ony of feed does not exist, fallback call will be executed for that feed.\\n /// @notice If data for any key not exists, function will revert. Use `getManyPriceDataRaw` method if you don't\\n /// want revert.\\n /// @param _keys array of feed keys\\n /// @return data PriceData array\\n function getManyPriceData(bytes32[] calldata _keys) external view returns (PriceData[] memory data);\\n\\n /// @dev same as getManyPriceData() but does not revert on empty data.\\n /// @notice This method does no revert if some data does not exists.\\n /// Check `data.timestamp` to see if price exist, if it is 0, then it does not exist.\\n function getManyPriceDataRaw(bytes32[] calldata _keys) external view returns (PriceData[] memory data);\\n\\n /// @dev this is main endpoint for reading feeds.\\n /// In case timestamp is empty (that means there is no data), contract will revert.\\n /// If you do not need whole data from `PriceData` struct, you can save some gas by using other view methods that\\n /// returns just what you need.\\n /// @notice method will revert if data for `_key` not exists.\\n /// @param _key hash of feed name\\n /// @return data full PriceData struct\\n function getPriceData(bytes32 _key) external view returns (PriceData memory data);\\n\\n /// @notice reader for mapping\\n /// @param _key hash of feed name\\n /// @return data full PriceData struct\\n function prices(bytes32 _key) external view returns (PriceData memory data);\\n\\n /// @notice method will revert if data for `_key` not exists.\\n /// @param _key hash of feed name\\n /// @return price\\n function getPrice(bytes32 _key) external view returns (uint128 price);\\n\\n /// @notice method will revert if data for `_key` not exists.\\n /// @param _key hash of feed name\\n /// @return price\\n /// @return timestamp\\n function getPriceTimestamp(bytes32 _key) external view returns (uint128 price, uint32 timestamp);\\n\\n /// @notice method will revert if data for `_key` not exists.\\n /// @param _key hash of feed name\\n /// @return price\\n /// @return timestamp\\n /// @return heartbeat\\n function getPriceTimestampHeartbeat(bytes32 _key)\\n external\\n view\\n returns (uint128 price, uint32 timestamp, uint24 heartbeat);\\n\\n /// @dev This method should be used only for Layer2 as it is more gas consuming than others views.\\n /// @notice It does not revert on empty data.\\n /// @param _name string feed name\\n /// @return data PriceData\\n function getPriceDataByName(string calldata _name) external view returns (PriceData memory data);\\n\\n /// @dev decimals for prices stored in this contract\\n function DECIMALS() external view returns (uint8); // solhint-disable-line func-name-mixedcase\\n}\\n\",\"keccak256\":\"0x3b89742a9ab465f00aa9cf8635a5dfdc02d7ecf9bad8f564bee7c15d8aea46cb\",\"license\":\"MIT\"},\"contracts/onChainFeeds/UmbrellaFeeds.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.13;\\n\\nimport \\\"../interfaces/IUmbrellaFeeds.sol\\\";\\nimport \\\"../interfaces/IRegistry.sol\\\";\\nimport \\\"../interfaces/IStakingBankStatic.sol\\\";\\n\\n/// @dev Main contract for all on-chain data.\\n/// Check `UmbrellaFeedsReader` to see how to integrate.\\n///\\n/// @notice This contract can be destroyed and replaced with new one (with new address).\\n/// For best gas efficiency you should pick one of two ways of integration:\\n/// 1. make `UmbrellaFeeds` immutable and use fallback in case of selfdestruct. After new deployment, it is recommended\\n/// to update address to avoid fallback and reduce gas cost to minimum. In long run this is most efficient solution,\\n/// better than any proxy.\\n/// 2. always check newest `UmbrellaFeeds` via `Regostry` and fallback will not be needed.\\ncontract UmbrellaFeeds is IUmbrellaFeeds {\\n bytes constant public ETH_PREFIX = \\\"\\\\x19Ethereum Signed Message:\\\\n32\\\";\\n string constant public NAME = \\\"UmbrellaFeeds\\\";\\n\\n /// @dev deployment time, used for protect for unintentional destroy\\n uint256 public immutable DEPLOYED_AT; // solhint-disable-line var-name-mixedcase\\n\\n /// @dev Registry contract where list of all addresses is stored. Fallback feature uses this registry to\\n /// resolve newest `UmbrellaFeeds` address\\n IRegistry public immutable REGISTRY; // solhint-disable-line var-name-mixedcase\\n\\n /// @dev StakingBank contract where list of validators is stored\\n IStakingBankStatic public immutable STAKING_BANK; // solhint-disable-line var-name-mixedcase\\n\\n /// @dev minimal number of signatures required for accepting price submission (PoA)\\n uint16 public immutable REQUIRED_SIGNATURES; // solhint-disable-line var-name-mixedcase\\n\\n /// @dev decimals for prices stored in this contract\\n uint8 public immutable DECIMALS; // solhint-disable-line var-name-mixedcase\\n\\n /// @notice map of all prices stored in this contract, key for map is hash of feed name\\n /// eg for \\\"ETH-USD\\\" feed, key will be hash(\\\"ETH-USD\\\")\\n mapping (bytes32 => PriceData) private _prices;\\n\\n error ArraysDataDoNotMatch();\\n error FeedNotExist();\\n error NotEnoughSignatures();\\n error InvalidSigner();\\n error InvalidRequiredSignatures();\\n error SignaturesOutOfOrder();\\n error ECDSAInvalidSignatureS();\\n error ECDSAInvalidSignatureV();\\n error OldData();\\n error ContractInUse();\\n error ContractNotInitialised();\\n\\n /// @param _contractRegistry Registry address\\n /// @param _requiredSignatures number of required signatures for accepting consensus submission\\n /// @param _decimals decimals for prices stored in this contract\\n constructor(\\n IRegistry _contractRegistry,\\n uint16 _requiredSignatures,\\n uint8 _decimals\\n ) {\\n if (_requiredSignatures == 0) revert InvalidRequiredSignatures();\\n\\n REGISTRY = _contractRegistry;\\n REQUIRED_SIGNATURES = _requiredSignatures;\\n STAKING_BANK = IStakingBankStatic(_contractRegistry.requireAndGetAddress(\\\"StakingBank\\\"));\\n DECIMALS = _decimals;\\n DEPLOYED_AT = block.timestamp;\\n }\\n\\n /// @dev destroys old contract\\n /// there is sanity check that prevents abuse of destroy method\\n /// @param _name string feed key to verify, that contract was initialised\\n function destroy(string calldata _name) external {\\n if (REGISTRY.getAddressByString(NAME) == address(this)) revert ContractInUse();\\n\\n if (_prices[keccak256(abi.encodePacked(_name))].timestamp == 0 && DEPLOYED_AT + 3 days > block.timestamp) {\\n revert ContractNotInitialised();\\n }\\n\\n selfdestruct(payable(msg.sender));\\n }\\n\\n /// @inheritdoc IUmbrellaFeeds\\n function update(\\n bytes32[] calldata _priceKeys,\\n PriceData[] calldata _priceDatas,\\n Signature[] calldata _signatures\\n ) external {\\n if (_priceKeys.length != _priceDatas.length) revert ArraysDataDoNotMatch();\\n\\n bytes32 priceDataHash = keccak256(abi.encode(getChainId(), address(this), _priceKeys, _priceDatas));\\n verifySignatures(priceDataHash, _signatures);\\n\\n uint256 i;\\n\\n while (i < _priceDatas.length) {\\n bytes32 priceKey = _priceKeys[i];\\n\\n // we do not allow for older prices\\n // at the same time it prevents from reusing signatures\\n if (_prices[priceKey].timestamp >= _priceDatas[i].timestamp) revert OldData();\\n\\n _prices[priceKey] = _priceDatas[i];\\n\\n // atm there is no need for events, so in order to save gas, we do not emit any\\n unchecked { i++; }\\n }\\n }\\n\\n /// @inheritdoc IUmbrellaFeeds\\n function getManyPriceData(bytes32[] calldata _keys) external view returns (PriceData[] memory data) {\\n data = new PriceData[](_keys.length);\\n\\n for (uint256 i; i < _keys.length;) {\\n data[i] = _prices[_keys[i]];\\n if (data[i].timestamp == 0) revert FeedNotExist();\\n\\n unchecked { i++; }\\n }\\n }\\n\\n /// @inheritdoc IUmbrellaFeeds\\n function getManyPriceDataRaw(bytes32[] calldata _keys) external view returns (PriceData[] memory data) {\\n data = new PriceData[](_keys.length);\\n\\n for (uint256 i; i < _keys.length;) {\\n data[i] = _prices[_keys[i]];\\n unchecked { i++; }\\n }\\n }\\n\\n /// @inheritdoc IUmbrellaFeeds\\n function prices(bytes32 _key) external view returns (PriceData memory data) {\\n data = _prices[_key];\\n }\\n\\n /// @inheritdoc IUmbrellaFeeds\\n function getPriceData(bytes32 _key) external view returns (PriceData memory data) {\\n data = _prices[_key];\\n if (data.timestamp == 0) revert FeedNotExist();\\n }\\n\\n /// @inheritdoc IUmbrellaFeeds\\n function getPrice(bytes32 _key) external view returns (uint128 price) {\\n PriceData memory data = _prices[_key];\\n if (data.timestamp == 0) revert FeedNotExist();\\n\\n return data.price;\\n }\\n\\n /// @inheritdoc IUmbrellaFeeds\\n function getPriceTimestamp(bytes32 _key) external view returns (uint128 price, uint32 timestamp) {\\n PriceData memory data = _prices[_key];\\n if (data.timestamp == 0) revert FeedNotExist();\\n\\n return (data.price, data.timestamp);\\n }\\n\\n function getPriceTimestampHeartbeat(bytes32 _key)\\n external\\n view\\n returns (uint128 price, uint32 timestamp, uint24 heartbeat)\\n {\\n PriceData memory data = _prices[_key];\\n if (data.timestamp == 0) revert FeedNotExist();\\n\\n return (data.price, data.timestamp, data.heartbeat);\\n }\\n\\n /// @inheritdoc IUmbrellaFeeds\\n function getPriceDataByName(string calldata _name) external view returns (PriceData memory data) {\\n bytes32 key = keccak256(abi.encodePacked(_name));\\n data = _prices[key];\\n }\\n\\n /// @dev helper method for QA purposes\\n /// @return hash of data that are signed by validators (keys and priced data)\\n function hashData(bytes32[] calldata _priceKeys, PriceData[] calldata _priceDatas)\\n external\\n view\\n returns (bytes32)\\n {\\n return keccak256(abi.encode(getChainId(), address(this), _priceKeys, _priceDatas));\\n }\\n\\n /// @param _hash hash of signed data\\n /// @param _signatures array of validators signatures\\n function verifySignatures(bytes32 _hash, Signature[] calldata _signatures) public view {\\n address prevSigner = address(0x0);\\n\\n if (_signatures.length < REQUIRED_SIGNATURES) revert NotEnoughSignatures();\\n\\n address[] memory validators = new address[](REQUIRED_SIGNATURES);\\n\\n // to save gas we check only required number of signatures\\n // case, where you can have part of signatures invalid but still enough valid in total is not supported\\n for (uint256 i; i < REQUIRED_SIGNATURES;) {\\n (uint8 v, bytes32 r, bytes32 s) = (_signatures[i].v, _signatures[i].r, _signatures[i].s);\\n\\n if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {\\n revert ECDSAInvalidSignatureS();\\n }\\n\\n if (uint8(v) != 27 && uint8(v) != 28) revert ECDSAInvalidSignatureV();\\n\\n address signer = recoverSigner(_hash, v, r, s);\\n if (prevSigner >= signer) revert SignaturesOutOfOrder();\\n\\n // because we check only required number of signatures, any invalid one will cause revert\\n prevSigner = signer;\\n validators[i] = signer;\\n\\n unchecked { i++; }\\n }\\n\\n // bulk verification can optimise gas when we have 5 or more validators\\n if (!STAKING_BANK.verifyValidators(validators)) revert InvalidSigner();\\n }\\n\\n function getChainId() public view returns (uint256 id) {\\n // solhint-disable-next-line no-inline-assembly\\n assembly {\\n id := chainid()\\n }\\n }\\n\\n /// @param _hash hashed of data\\n /// @param _v part of signature\\n /// @param _r part of signature\\n /// @param _s part of signature\\n /// @return signer address\\n function recoverSigner(bytes32 _hash, uint8 _v, bytes32 _r, bytes32 _s) public pure returns (address) {\\n bytes32 hash = keccak256(abi.encodePacked(ETH_PREFIX, _hash));\\n return ecrecover(hash, _v, _r, _s);\\n }\\n\\n /// @dev to follow Registrable interface\\n function getName() public pure returns (bytes32) {\\n return \\\"UmbrellaFeeds\\\";\\n }\\n}\\n\",\"keccak256\":\"0xf5dcfbbdfe5a5ed6e7579246363b10cdc0aa30580fec74025e0704c2b042d369\",\"license\":\"MIT\"}},\"version\":1}", + "bytecode": "0x6101206040523480156200001257600080fd5b50604051620030a4380380620030a4833981810160405281019062000038919062000286565b60008261ffff160362000077576040517f458bb42100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff1660a08173ffffffffffffffffffffffffffffffffffffffff16815250508161ffff1660e08161ffff16815250508273ffffffffffffffffffffffffffffffffffffffff166346bcb49d6040518163ffffffff1660e01b8152600401620000f49062000308565b602060405180830381865afa15801562000112573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000138919062000354565b73ffffffffffffffffffffffffffffffffffffffff1660c08173ffffffffffffffffffffffffffffffffffffffff16815250508060ff166101008160ff1681525050426080818152505050505062000386565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620001bd8262000190565b9050919050565b6000620001d182620001b0565b9050919050565b620001e381620001c4565b8114620001ef57600080fd5b50565b6000815190506200020381620001d8565b92915050565b600061ffff82169050919050565b620002228162000209565b81146200022e57600080fd5b50565b600081519050620002428162000217565b92915050565b600060ff82169050919050565b620002608162000248565b81146200026c57600080fd5b50565b600081519050620002808162000255565b92915050565b600080600060608486031215620002a257620002a16200018b565b5b6000620002b286828701620001f2565b9350506020620002c58682870162000231565b9250506040620002d8868287016200026f565b9150509250925092565b7f5374616b696e6742616e6b000000000000000000000000000000000000000000815250565b60006020820190506200031e60008301620002e2565b919050565b6200032e81620001b0565b81146200033a57600080fd5b50565b6000815190506200034e8162000323565b92915050565b6000602082840312156200036d576200036c6200018b565b5b60006200037d848285016200033d565b91505092915050565b60805160a05160c05160e05161010051612caf620003f560003960006108b10152600081816104e501528181610548015281816105ba01526116980152600081816107da01526116f501526000818161045e015261107e0152600081816111fd015261127a0152612caf6000f3fe608060405234801561001057600080fd5b50600436106101125760003560e01c806306433b1b1461011757806317d7de7c1461013557806324c89a491461015357806326559877146101715780632e0f26251461018d5780632e550693146101ab57806331d98b3f146101db5780633408e4701461020b578063385e05da1461022957806343fa6211146102595780635b38adc71461028957806360846bc6146102b95780636b9c3c7c146102e95780636ebb8cd2146103055780638a1194d31461032357806395f1cf301461035457806396594f66146103705780639ac18b19146103a2578063a3f4df7e146103c0578063c65a53ad146103de578063ccc6fd69146103fc578063d45167d01461042c575b600080fd5b61011f61045c565b60405161012c91906118df565b60405180910390f35b61013d610480565b60405161014a9190611913565b60405180910390f35b61015b6104a8565b60405161016891906119c7565b60405180910390f35b61018b60048036038101906101869190611a84565b6104e1565b005b6101956108af565b6040516101a29190611b00565b60405180910390f35b6101c560048036038101906101c09190611b71565b6108d3565b6040516101d29190611d39565b60405180910390f35b6101f560048036038101906101f09190611d5b565b610a54565b6040516102029190611d97565b60405180910390f35b610213610b77565b6040516102209190611dcb565b60405180910390f35b610243600480360381019061023e9190611b71565b610b7f565b6040516102509190611d39565b60405180910390f35b610273600480360381019061026e9190611d5b565b610d5e565b6040516102809190611e3b565b60405180910390f35b6102a3600480360381019061029e9190611eac565b610e7e565b6040516102b09190611e3b565b60405180910390f35b6102d360048036038101906102ce9190611d5b565b610f89565b6040516102e09190611e3b565b60405180910390f35b61030360048036038101906102fe9190611eac565b611065565b005b61030d611278565b60405161031a9190611dcb565b60405180910390f35b61033d60048036038101906103389190611d5b565b61129c565b60405161034b929190611f08565b60405180910390f35b61036e60048036038101906103699190611f87565b6113c8565b005b61038a60048036038101906103859190611d5b565b611560565b6040516103999392919061204a565b60405180910390f35b6103aa611696565b6040516103b7919061209e565b60405180910390f35b6103c86116ba565b6040516103d5919061210e565b60405180910390f35b6103e66116f3565b6040516103f39190612151565b60405180910390f35b6104166004803603810190610411919061216c565b611717565b6040516104239190611913565b60405180910390f35b61044660048036038101906104419190612219565b61175b565b60405161045391906122a1565b60405180910390f35b7f000000000000000000000000000000000000000000000000000000000000000081565b60007f556d6272656c6c61466565647300000000000000000000000000000000000000905090565b6040518060400160405280601c81526020017f19457468657265756d205369676e6564204d6573736167653a0a33320000000081525081565b60007f000000000000000000000000000000000000000000000000000000000000000061ffff16838390501015610544576040517fe246dc6300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000061ffff1667ffffffffffffffff811115610584576105836122bc565b5b6040519080825280602002602001820160405280156105b25781602001602082028036833780820191505090505b50905060005b7f000000000000000000000000000000000000000000000000000000000000000061ffff168110156107d75760008060008787858181106105fc576105fb6122eb565b5b9050606002016000016020810190610614919061231a565b888886818110610627576106266122eb565b5b90506060020160200135898987818110610644576106436122eb565b5b905060600201604001359250925092507f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08160001c11156106b1576040517f454ffaa700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b601b8360ff16141580156106c95750601c8360ff1614155b15610700576040517f1afa741400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061070e8a85858561175b565b90508073ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff1610610775576040517f9079f69b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8096508086868151811061078c5761078b6122eb565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508480600101955050505050506105b8565b507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16631d4f9ce0826040518263ffffffff1660e01b81526004016108319190612405565b602060405180830381865afa15801561084e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610872919061245f565b6108a8576040517f815e1d6400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60608282905067ffffffffffffffff8111156108f2576108f16122bc565b5b60405190808252806020026020018201604052801561092b57816020015b610918611818565b8152602001906001900390816109105790505b50905060005b83839050811015610a4d57600080858584818110610952576109516122eb565b5b9050602002013581526020019081526020016000206040518060800160405290816000820160009054906101000a900460ff1660ff1660ff1681526020016000820160019054906101000a900462ffffff1662ffffff1662ffffff1681526020016000820160049054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160089054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681525050828281518110610a3557610a346122eb565b5b60200260200101819052508080600101915050610931565b5092915050565b6000806000808481526020019081526020016000206040518060800160405290816000820160009054906101000a900460ff1660ff1660ff1681526020016000820160019054906101000a900462ffffff1662ffffff1662ffffff1681526020016000820160049054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160089054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff168152505090506000816040015163ffffffff1603610b6a576040517f15647ae900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060600151915050919050565b600046905090565b60608282905067ffffffffffffffff811115610b9e57610b9d6122bc565b5b604051908082528060200260200182016040528015610bd757816020015b610bc4611818565b815260200190600190039081610bbc5790505b50905060005b83839050811015610d5757600080858584818110610bfe57610bfd6122eb565b5b9050602002013581526020019081526020016000206040518060800160405290816000820160009054906101000a900460ff1660ff1660ff1681526020016000820160019054906101000a900462ffffff1662ffffff1662ffffff1681526020016000820160049054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160089054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681525050828281518110610ce157610ce06122eb565b5b60200260200101819052506000828281518110610d0157610d006122eb565b5b60200260200101516040015163ffffffff1603610d4a576040517f15647ae900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8080600101915050610bdd565b5092915050565b610d66611818565b6000808381526020019081526020016000206040518060800160405290816000820160009054906101000a900460ff1660ff1660ff1681526020016000820160019054906101000a900462ffffff1662ffffff1662ffffff1681526020016000820160049054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160089054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff168152505090506000816040015163ffffffff1603610e79576040517f15647ae900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b610e86611818565b60008383604051602001610e9b9291906124cb565b6040516020818303038152906040528051906020012090506000808281526020019081526020016000206040518060800160405290816000820160009054906101000a900460ff1660ff1660ff1681526020016000820160019054906101000a900462ffffff1662ffffff1662ffffff1681526020016000820160049054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160089054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff168152505091505092915050565b610f91611818565b6000808381526020019081526020016000206040518060800160405290816000820160009054906101000a900460ff1660ff1660ff1681526020016000820160019054906101000a900462ffffff1662ffffff1662ffffff1681526020016000820160049054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160089054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16815250509050919050565b3073ffffffffffffffffffffffffffffffffffffffff167f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663e8f98f886040518060400160405280600d81526020017f556d6272656c6c614665656473000000000000000000000000000000000000008152506040518263ffffffff1660e01b815260040161110a919061210e565b602060405180830381865afa158015611127573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061114b9190612510565b73ffffffffffffffffffffffffffffffffffffffff1603611198576040517f8c3e700900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080600084846040516020016111b09291906124cb565b60405160208183030381529060405280519060200120815260200190815260200160002060000160049054906101000a900463ffffffff1663ffffffff161480156112285750426203f4807f0000000000000000000000000000000000000000000000000000000000000000611226919061256c565b115b1561125f576040517fcf51b43b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff16ff5b7f000000000000000000000000000000000000000000000000000000000000000081565b60008060008060008581526020019081526020016000206040518060800160405290816000820160009054906101000a900460ff1660ff1660ff1681526020016000820160019054906101000a900462ffffff1662ffffff1662ffffff1681526020016000820160049054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160089054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff168152505090506000816040015163ffffffff16036113b4576040517f15647ae900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806060015181604001519250925050915091565b838390508686905014611407576040517f0cf7902300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611411610b77565b308888888860405160200161142b96959493929190612820565b60405160208183030381529060405280519060200120905061144e8184846104e1565b60005b85859050811015611556576000888883818110611471576114706122eb565b5b90506020020135905086868381811061148d5761148c6122eb565b5b90506080020160400160208101906114a59190612877565b63ffffffff1660008083815260200190815260200160002060000160049054906101000a900463ffffffff1663ffffffff161061150e576040517f1251b2f300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b868683818110611521576115206122eb565b5b90506080020160008083815260200190815260200160002081816115459190612ba1565b905050818060010192505050611451565b5050505050505050565b6000806000806000808681526020019081526020016000206040518060800160405290816000820160009054906101000a900460ff1660ff1660ff1681526020016000820160019054906101000a900462ffffff1662ffffff1662ffffff1681526020016000820160049054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160089054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff168152505090506000816040015163ffffffff1603611679576040517f15647ae900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806060015181604001518260200151935093509350509193909250565b7f000000000000000000000000000000000000000000000000000000000000000081565b6040518060400160405280600d81526020017f556d6272656c6c6146656564730000000000000000000000000000000000000081525081565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000611721610b77565b308686868660405160200161173b96959493929190612820565b604051602081830303815290604052805190602001209050949350505050565b6000806040518060400160405280601c81526020017f19457468657265756d205369676e6564204d6573736167653a0a333200000000815250866040516020016117a6929190612c0c565b604051602081830303815290604052805190602001209050600181868686604051600081526020016040526040516117e19493929190612c34565b6020604051602081039080840390855afa158015611803573d6000803e3d6000fd5b50505060206040510351915050949350505050565b6040518060800160405280600060ff168152602001600062ffffff168152602001600063ffffffff16815260200160006fffffffffffffffffffffffffffffffff1681525090565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006118a56118a061189b84611860565b611880565b611860565b9050919050565b60006118b78261188a565b9050919050565b60006118c9826118ac565b9050919050565b6118d9816118be565b82525050565b60006020820190506118f460008301846118d0565b92915050565b6000819050919050565b61190d816118fa565b82525050565b60006020820190506119286000830184611904565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561196857808201518184015260208101905061194d565b83811115611977576000848401525b50505050565b6000601f19601f8301169050919050565b60006119998261192e565b6119a38185611939565b93506119b381856020860161194a565b6119bc8161197d565b840191505092915050565b600060208201905081810360008301526119e1818461198e565b905092915050565b600080fd5b600080fd5b6119fc816118fa565b8114611a0757600080fd5b50565b600081359050611a19816119f3565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f840112611a4457611a43611a1f565b5b8235905067ffffffffffffffff811115611a6157611a60611a24565b5b602083019150836060820283011115611a7d57611a7c611a29565b5b9250929050565b600080600060408486031215611a9d57611a9c6119e9565b5b6000611aab86828701611a0a565b935050602084013567ffffffffffffffff811115611acc57611acb6119ee565b5b611ad886828701611a2e565b92509250509250925092565b600060ff82169050919050565b611afa81611ae4565b82525050565b6000602082019050611b156000830184611af1565b92915050565b60008083601f840112611b3157611b30611a1f565b5b8235905067ffffffffffffffff811115611b4e57611b4d611a24565b5b602083019150836020820283011115611b6a57611b69611a29565b5b9250929050565b60008060208385031215611b8857611b876119e9565b5b600083013567ffffffffffffffff811115611ba657611ba56119ee565b5b611bb285828601611b1b565b92509250509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b611bf381611ae4565b82525050565b600062ffffff82169050919050565b611c1181611bf9565b82525050565b600063ffffffff82169050919050565b611c3081611c17565b82525050565b60006fffffffffffffffffffffffffffffffff82169050919050565b611c5b81611c36565b82525050565b608082016000820151611c776000850182611bea565b506020820151611c8a6020850182611c08565b506040820151611c9d6040850182611c27565b506060820151611cb06060850182611c52565b50505050565b6000611cc28383611c61565b60808301905092915050565b6000602082019050919050565b6000611ce682611bbe565b611cf08185611bc9565b9350611cfb83611bda565b8060005b83811015611d2c578151611d138882611cb6565b9750611d1e83611cce565b925050600181019050611cff565b5085935050505092915050565b60006020820190508181036000830152611d538184611cdb565b905092915050565b600060208284031215611d7157611d706119e9565b5b6000611d7f84828501611a0a565b91505092915050565b611d9181611c36565b82525050565b6000602082019050611dac6000830184611d88565b92915050565b6000819050919050565b611dc581611db2565b82525050565b6000602082019050611de06000830184611dbc565b92915050565b608082016000820151611dfc6000850182611bea565b506020820151611e0f6020850182611c08565b506040820151611e226040850182611c27565b506060820151611e356060850182611c52565b50505050565b6000608082019050611e506000830184611de6565b92915050565b60008083601f840112611e6c57611e6b611a1f565b5b8235905067ffffffffffffffff811115611e8957611e88611a24565b5b602083019150836001820283011115611ea557611ea4611a29565b5b9250929050565b60008060208385031215611ec357611ec26119e9565b5b600083013567ffffffffffffffff811115611ee157611ee06119ee565b5b611eed85828601611e56565b92509250509250929050565b611f0281611c17565b82525050565b6000604082019050611f1d6000830185611d88565b611f2a6020830184611ef9565b9392505050565b60008083601f840112611f4757611f46611a1f565b5b8235905067ffffffffffffffff811115611f6457611f63611a24565b5b602083019150836080820283011115611f8057611f7f611a29565b5b9250929050565b60008060008060008060608789031215611fa457611fa36119e9565b5b600087013567ffffffffffffffff811115611fc257611fc16119ee565b5b611fce89828a01611b1b565b9650965050602087013567ffffffffffffffff811115611ff157611ff06119ee565b5b611ffd89828a01611f31565b9450945050604087013567ffffffffffffffff8111156120205761201f6119ee565b5b61202c89828a01611a2e565b92509250509295509295509295565b61204481611bf9565b82525050565b600060608201905061205f6000830186611d88565b61206c6020830185611ef9565b612079604083018461203b565b949350505050565b600061ffff82169050919050565b61209881612081565b82525050565b60006020820190506120b3600083018461208f565b92915050565b600081519050919050565b600082825260208201905092915050565b60006120e0826120b9565b6120ea81856120c4565b93506120fa81856020860161194a565b6121038161197d565b840191505092915050565b6000602082019050818103600083015261212881846120d5565b905092915050565b600061213b826118ac565b9050919050565b61214b81612130565b82525050565b60006020820190506121666000830184612142565b92915050565b60008060008060408587031215612186576121856119e9565b5b600085013567ffffffffffffffff8111156121a4576121a36119ee565b5b6121b087828801611b1b565b9450945050602085013567ffffffffffffffff8111156121d3576121d26119ee565b5b6121df87828801611f31565b925092505092959194509250565b6121f681611ae4565b811461220157600080fd5b50565b600081359050612213816121ed565b92915050565b60008060008060808587031215612233576122326119e9565b5b600061224187828801611a0a565b945050602061225287828801612204565b935050604061226387828801611a0a565b925050606061227487828801611a0a565b91505092959194509250565b600061228b82611860565b9050919050565b61229b81612280565b82525050565b60006020820190506122b66000830184612292565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000602082840312156123305761232f6119e9565b5b600061233e84828501612204565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61237c81612280565b82525050565b600061238e8383612373565b60208301905092915050565b6000602082019050919050565b60006123b282612347565b6123bc8185612352565b93506123c783612363565b8060005b838110156123f85781516123df8882612382565b97506123ea8361239a565b9250506001810190506123cb565b5085935050505092915050565b6000602082019050818103600083015261241f81846123a7565b905092915050565b60008115159050919050565b61243c81612427565b811461244757600080fd5b50565b60008151905061245981612433565b92915050565b600060208284031215612475576124746119e9565b5b60006124838482850161244a565b91505092915050565b600081905092915050565b82818337600083830152505050565b60006124b2838561248c565b93506124bf838584612497565b82840190509392505050565b60006124d88284866124a6565b91508190509392505050565b6124ed81612280565b81146124f857600080fd5b50565b60008151905061250a816124e4565b92915050565b600060208284031215612526576125256119e9565b5b6000612534848285016124fb565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061257782611db2565b915061258283611db2565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156125b7576125b661253d565b5b828201905092915050565b600082825260208201905092915050565b600080fd5b60006125e483856125c2565b93507f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff831115612617576126166125d3565b5b602083029250612628838584612497565b82840190509392505050565b6000819050919050565b600061264d6020840184612204565b905092915050565b61265e81611bf9565b811461266957600080fd5b50565b60008135905061267b81612655565b92915050565b6000612690602084018461266c565b905092915050565b6126a181611c17565b81146126ac57600080fd5b50565b6000813590506126be81612698565b92915050565b60006126d360208401846126af565b905092915050565b6126e481611c36565b81146126ef57600080fd5b50565b600081359050612701816126db565b92915050565b600061271660208401846126f2565b905092915050565b6080820161272f600083018361263e565b61273c6000850182611bea565b5061274a6020830183612681565b6127576020850182611c08565b5061276560408301836126c4565b6127726040850182611c27565b506127806060830183612707565b61278d6060850182611c52565b50505050565b600061279f838361271e565b60808301905092915050565b600082905092915050565b6000608082019050919050565b60006127cf8385611bc9565b93506127da82612634565b8060005b85811015612813576127f082846127ab565b6127fa8882612793565b9750612805836127b6565b9250506001810190506127de565b5085925050509392505050565b60006080820190506128356000830189611dbc565b6128426020830188612292565b81810360408301526128558186886125d8565b9050818103606083015261286a8184866127c3565b9050979650505050505050565b60006020828403121561288d5761288c6119e9565b5b600061289b848285016126af565b91505092915050565b600081356128b1816121ed565b80915050919050565b60008160001b9050919050565b600060ff6128d4846128ba565b9350801983169250808416831791505092915050565b60006129056129006128fb84611ae4565b611880565b611ae4565b9050919050565b6000819050919050565b61291f826128ea565b61293261292b8261290c565b83546128c7565b8255505050565b6000813561294681612655565b80915050919050565b60008160081b9050919050565b600063ffffff0061296c8461294f565b9350801983169250808416831791505092915050565b600061299d61299861299384611bf9565b611880565b611bf9565b9050919050565b6000819050919050565b6129b782612982565b6129ca6129c3826129a4565b835461295c565b8255505050565b600081356129de81612698565b80915050919050565b60008160201b9050919050565b600067ffffffff00000000612a08846129e7565b9350801983169250808416831791505092915050565b6000612a39612a34612a2f84611c17565b611880565b611c17565b9050919050565b6000819050919050565b612a5382612a1e565b612a66612a5f82612a40565b83546129f4565b8255505050565b60008135612a7a816126db565b80915050919050565b60008160401b9050919050565b600077ffffffffffffffffffffffffffffffff0000000000000000612ab484612a83565b9350801983169250808416831791505092915050565b6000612ae5612ae0612adb84611c36565b611880565b611c36565b9050919050565b6000819050919050565b612aff82612aca565b612b12612b0b82612aec565b8354612a90565b8255505050565b600081016000830180612b2b816128a4565b9050612b378184612916565b505050600081016020830180612b4c81612939565b9050612b5881846129ae565b505050600081016040830180612b6d816129d1565b9050612b798184612a4a565b505050600081016060830180612b8e81612a6d565b9050612b9a8184612af6565b5050505050565b612bab8282612b19565b5050565b600081905092915050565b6000612bc58261192e565b612bcf8185612baf565b9350612bdf81856020860161194a565b80840191505092915050565b6000819050919050565b612c06612c01826118fa565b612beb565b82525050565b6000612c188285612bba565b9150612c248284612bf5565b6020820191508190509392505050565b6000608082019050612c496000830187611904565b612c566020830186611af1565b612c636040830185611904565b612c706060830184611904565b9594505050505056fea26469706673582212204e20478e2e3070a20aa83127753a448e1b78b26fd4b44673d2f1b4027a2cf6be64736f6c634300080d0033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106101125760003560e01c806306433b1b1461011757806317d7de7c1461013557806324c89a491461015357806326559877146101715780632e0f26251461018d5780632e550693146101ab57806331d98b3f146101db5780633408e4701461020b578063385e05da1461022957806343fa6211146102595780635b38adc71461028957806360846bc6146102b95780636b9c3c7c146102e95780636ebb8cd2146103055780638a1194d31461032357806395f1cf301461035457806396594f66146103705780639ac18b19146103a2578063a3f4df7e146103c0578063c65a53ad146103de578063ccc6fd69146103fc578063d45167d01461042c575b600080fd5b61011f61045c565b60405161012c91906118df565b60405180910390f35b61013d610480565b60405161014a9190611913565b60405180910390f35b61015b6104a8565b60405161016891906119c7565b60405180910390f35b61018b60048036038101906101869190611a84565b6104e1565b005b6101956108af565b6040516101a29190611b00565b60405180910390f35b6101c560048036038101906101c09190611b71565b6108d3565b6040516101d29190611d39565b60405180910390f35b6101f560048036038101906101f09190611d5b565b610a54565b6040516102029190611d97565b60405180910390f35b610213610b77565b6040516102209190611dcb565b60405180910390f35b610243600480360381019061023e9190611b71565b610b7f565b6040516102509190611d39565b60405180910390f35b610273600480360381019061026e9190611d5b565b610d5e565b6040516102809190611e3b565b60405180910390f35b6102a3600480360381019061029e9190611eac565b610e7e565b6040516102b09190611e3b565b60405180910390f35b6102d360048036038101906102ce9190611d5b565b610f89565b6040516102e09190611e3b565b60405180910390f35b61030360048036038101906102fe9190611eac565b611065565b005b61030d611278565b60405161031a9190611dcb565b60405180910390f35b61033d60048036038101906103389190611d5b565b61129c565b60405161034b929190611f08565b60405180910390f35b61036e60048036038101906103699190611f87565b6113c8565b005b61038a60048036038101906103859190611d5b565b611560565b6040516103999392919061204a565b60405180910390f35b6103aa611696565b6040516103b7919061209e565b60405180910390f35b6103c86116ba565b6040516103d5919061210e565b60405180910390f35b6103e66116f3565b6040516103f39190612151565b60405180910390f35b6104166004803603810190610411919061216c565b611717565b6040516104239190611913565b60405180910390f35b61044660048036038101906104419190612219565b61175b565b60405161045391906122a1565b60405180910390f35b7f000000000000000000000000000000000000000000000000000000000000000081565b60007f556d6272656c6c61466565647300000000000000000000000000000000000000905090565b6040518060400160405280601c81526020017f19457468657265756d205369676e6564204d6573736167653a0a33320000000081525081565b60007f000000000000000000000000000000000000000000000000000000000000000061ffff16838390501015610544576040517fe246dc6300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000061ffff1667ffffffffffffffff811115610584576105836122bc565b5b6040519080825280602002602001820160405280156105b25781602001602082028036833780820191505090505b50905060005b7f000000000000000000000000000000000000000000000000000000000000000061ffff168110156107d75760008060008787858181106105fc576105fb6122eb565b5b9050606002016000016020810190610614919061231a565b888886818110610627576106266122eb565b5b90506060020160200135898987818110610644576106436122eb565b5b905060600201604001359250925092507f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08160001c11156106b1576040517f454ffaa700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b601b8360ff16141580156106c95750601c8360ff1614155b15610700576040517f1afa741400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061070e8a85858561175b565b90508073ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff1610610775576040517f9079f69b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8096508086868151811061078c5761078b6122eb565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508480600101955050505050506105b8565b507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16631d4f9ce0826040518263ffffffff1660e01b81526004016108319190612405565b602060405180830381865afa15801561084e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610872919061245f565b6108a8576040517f815e1d6400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60608282905067ffffffffffffffff8111156108f2576108f16122bc565b5b60405190808252806020026020018201604052801561092b57816020015b610918611818565b8152602001906001900390816109105790505b50905060005b83839050811015610a4d57600080858584818110610952576109516122eb565b5b9050602002013581526020019081526020016000206040518060800160405290816000820160009054906101000a900460ff1660ff1660ff1681526020016000820160019054906101000a900462ffffff1662ffffff1662ffffff1681526020016000820160049054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160089054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681525050828281518110610a3557610a346122eb565b5b60200260200101819052508080600101915050610931565b5092915050565b6000806000808481526020019081526020016000206040518060800160405290816000820160009054906101000a900460ff1660ff1660ff1681526020016000820160019054906101000a900462ffffff1662ffffff1662ffffff1681526020016000820160049054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160089054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff168152505090506000816040015163ffffffff1603610b6a576040517f15647ae900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060600151915050919050565b600046905090565b60608282905067ffffffffffffffff811115610b9e57610b9d6122bc565b5b604051908082528060200260200182016040528015610bd757816020015b610bc4611818565b815260200190600190039081610bbc5790505b50905060005b83839050811015610d5757600080858584818110610bfe57610bfd6122eb565b5b9050602002013581526020019081526020016000206040518060800160405290816000820160009054906101000a900460ff1660ff1660ff1681526020016000820160019054906101000a900462ffffff1662ffffff1662ffffff1681526020016000820160049054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160089054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681525050828281518110610ce157610ce06122eb565b5b60200260200101819052506000828281518110610d0157610d006122eb565b5b60200260200101516040015163ffffffff1603610d4a576040517f15647ae900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8080600101915050610bdd565b5092915050565b610d66611818565b6000808381526020019081526020016000206040518060800160405290816000820160009054906101000a900460ff1660ff1660ff1681526020016000820160019054906101000a900462ffffff1662ffffff1662ffffff1681526020016000820160049054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160089054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff168152505090506000816040015163ffffffff1603610e79576040517f15647ae900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b610e86611818565b60008383604051602001610e9b9291906124cb565b6040516020818303038152906040528051906020012090506000808281526020019081526020016000206040518060800160405290816000820160009054906101000a900460ff1660ff1660ff1681526020016000820160019054906101000a900462ffffff1662ffffff1662ffffff1681526020016000820160049054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160089054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff168152505091505092915050565b610f91611818565b6000808381526020019081526020016000206040518060800160405290816000820160009054906101000a900460ff1660ff1660ff1681526020016000820160019054906101000a900462ffffff1662ffffff1662ffffff1681526020016000820160049054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160089054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16815250509050919050565b3073ffffffffffffffffffffffffffffffffffffffff167f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663e8f98f886040518060400160405280600d81526020017f556d6272656c6c614665656473000000000000000000000000000000000000008152506040518263ffffffff1660e01b815260040161110a919061210e565b602060405180830381865afa158015611127573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061114b9190612510565b73ffffffffffffffffffffffffffffffffffffffff1603611198576040517f8c3e700900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080600084846040516020016111b09291906124cb565b60405160208183030381529060405280519060200120815260200190815260200160002060000160049054906101000a900463ffffffff1663ffffffff161480156112285750426203f4807f0000000000000000000000000000000000000000000000000000000000000000611226919061256c565b115b1561125f576040517fcf51b43b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff16ff5b7f000000000000000000000000000000000000000000000000000000000000000081565b60008060008060008581526020019081526020016000206040518060800160405290816000820160009054906101000a900460ff1660ff1660ff1681526020016000820160019054906101000a900462ffffff1662ffffff1662ffffff1681526020016000820160049054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160089054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff168152505090506000816040015163ffffffff16036113b4576040517f15647ae900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806060015181604001519250925050915091565b838390508686905014611407576040517f0cf7902300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611411610b77565b308888888860405160200161142b96959493929190612820565b60405160208183030381529060405280519060200120905061144e8184846104e1565b60005b85859050811015611556576000888883818110611471576114706122eb565b5b90506020020135905086868381811061148d5761148c6122eb565b5b90506080020160400160208101906114a59190612877565b63ffffffff1660008083815260200190815260200160002060000160049054906101000a900463ffffffff1663ffffffff161061150e576040517f1251b2f300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b868683818110611521576115206122eb565b5b90506080020160008083815260200190815260200160002081816115459190612ba1565b905050818060010192505050611451565b5050505050505050565b6000806000806000808681526020019081526020016000206040518060800160405290816000820160009054906101000a900460ff1660ff1660ff1681526020016000820160019054906101000a900462ffffff1662ffffff1662ffffff1681526020016000820160049054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160089054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff168152505090506000816040015163ffffffff1603611679576040517f15647ae900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806060015181604001518260200151935093509350509193909250565b7f000000000000000000000000000000000000000000000000000000000000000081565b6040518060400160405280600d81526020017f556d6272656c6c6146656564730000000000000000000000000000000000000081525081565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000611721610b77565b308686868660405160200161173b96959493929190612820565b604051602081830303815290604052805190602001209050949350505050565b6000806040518060400160405280601c81526020017f19457468657265756d205369676e6564204d6573736167653a0a333200000000815250866040516020016117a6929190612c0c565b604051602081830303815290604052805190602001209050600181868686604051600081526020016040526040516117e19493929190612c34565b6020604051602081039080840390855afa158015611803573d6000803e3d6000fd5b50505060206040510351915050949350505050565b6040518060800160405280600060ff168152602001600062ffffff168152602001600063ffffffff16815260200160006fffffffffffffffffffffffffffffffff1681525090565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006118a56118a061189b84611860565b611880565b611860565b9050919050565b60006118b78261188a565b9050919050565b60006118c9826118ac565b9050919050565b6118d9816118be565b82525050565b60006020820190506118f460008301846118d0565b92915050565b6000819050919050565b61190d816118fa565b82525050565b60006020820190506119286000830184611904565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561196857808201518184015260208101905061194d565b83811115611977576000848401525b50505050565b6000601f19601f8301169050919050565b60006119998261192e565b6119a38185611939565b93506119b381856020860161194a565b6119bc8161197d565b840191505092915050565b600060208201905081810360008301526119e1818461198e565b905092915050565b600080fd5b600080fd5b6119fc816118fa565b8114611a0757600080fd5b50565b600081359050611a19816119f3565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f840112611a4457611a43611a1f565b5b8235905067ffffffffffffffff811115611a6157611a60611a24565b5b602083019150836060820283011115611a7d57611a7c611a29565b5b9250929050565b600080600060408486031215611a9d57611a9c6119e9565b5b6000611aab86828701611a0a565b935050602084013567ffffffffffffffff811115611acc57611acb6119ee565b5b611ad886828701611a2e565b92509250509250925092565b600060ff82169050919050565b611afa81611ae4565b82525050565b6000602082019050611b156000830184611af1565b92915050565b60008083601f840112611b3157611b30611a1f565b5b8235905067ffffffffffffffff811115611b4e57611b4d611a24565b5b602083019150836020820283011115611b6a57611b69611a29565b5b9250929050565b60008060208385031215611b8857611b876119e9565b5b600083013567ffffffffffffffff811115611ba657611ba56119ee565b5b611bb285828601611b1b565b92509250509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b611bf381611ae4565b82525050565b600062ffffff82169050919050565b611c1181611bf9565b82525050565b600063ffffffff82169050919050565b611c3081611c17565b82525050565b60006fffffffffffffffffffffffffffffffff82169050919050565b611c5b81611c36565b82525050565b608082016000820151611c776000850182611bea565b506020820151611c8a6020850182611c08565b506040820151611c9d6040850182611c27565b506060820151611cb06060850182611c52565b50505050565b6000611cc28383611c61565b60808301905092915050565b6000602082019050919050565b6000611ce682611bbe565b611cf08185611bc9565b9350611cfb83611bda565b8060005b83811015611d2c578151611d138882611cb6565b9750611d1e83611cce565b925050600181019050611cff565b5085935050505092915050565b60006020820190508181036000830152611d538184611cdb565b905092915050565b600060208284031215611d7157611d706119e9565b5b6000611d7f84828501611a0a565b91505092915050565b611d9181611c36565b82525050565b6000602082019050611dac6000830184611d88565b92915050565b6000819050919050565b611dc581611db2565b82525050565b6000602082019050611de06000830184611dbc565b92915050565b608082016000820151611dfc6000850182611bea565b506020820151611e0f6020850182611c08565b506040820151611e226040850182611c27565b506060820151611e356060850182611c52565b50505050565b6000608082019050611e506000830184611de6565b92915050565b60008083601f840112611e6c57611e6b611a1f565b5b8235905067ffffffffffffffff811115611e8957611e88611a24565b5b602083019150836001820283011115611ea557611ea4611a29565b5b9250929050565b60008060208385031215611ec357611ec26119e9565b5b600083013567ffffffffffffffff811115611ee157611ee06119ee565b5b611eed85828601611e56565b92509250509250929050565b611f0281611c17565b82525050565b6000604082019050611f1d6000830185611d88565b611f2a6020830184611ef9565b9392505050565b60008083601f840112611f4757611f46611a1f565b5b8235905067ffffffffffffffff811115611f6457611f63611a24565b5b602083019150836080820283011115611f8057611f7f611a29565b5b9250929050565b60008060008060008060608789031215611fa457611fa36119e9565b5b600087013567ffffffffffffffff811115611fc257611fc16119ee565b5b611fce89828a01611b1b565b9650965050602087013567ffffffffffffffff811115611ff157611ff06119ee565b5b611ffd89828a01611f31565b9450945050604087013567ffffffffffffffff8111156120205761201f6119ee565b5b61202c89828a01611a2e565b92509250509295509295509295565b61204481611bf9565b82525050565b600060608201905061205f6000830186611d88565b61206c6020830185611ef9565b612079604083018461203b565b949350505050565b600061ffff82169050919050565b61209881612081565b82525050565b60006020820190506120b3600083018461208f565b92915050565b600081519050919050565b600082825260208201905092915050565b60006120e0826120b9565b6120ea81856120c4565b93506120fa81856020860161194a565b6121038161197d565b840191505092915050565b6000602082019050818103600083015261212881846120d5565b905092915050565b600061213b826118ac565b9050919050565b61214b81612130565b82525050565b60006020820190506121666000830184612142565b92915050565b60008060008060408587031215612186576121856119e9565b5b600085013567ffffffffffffffff8111156121a4576121a36119ee565b5b6121b087828801611b1b565b9450945050602085013567ffffffffffffffff8111156121d3576121d26119ee565b5b6121df87828801611f31565b925092505092959194509250565b6121f681611ae4565b811461220157600080fd5b50565b600081359050612213816121ed565b92915050565b60008060008060808587031215612233576122326119e9565b5b600061224187828801611a0a565b945050602061225287828801612204565b935050604061226387828801611a0a565b925050606061227487828801611a0a565b91505092959194509250565b600061228b82611860565b9050919050565b61229b81612280565b82525050565b60006020820190506122b66000830184612292565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000602082840312156123305761232f6119e9565b5b600061233e84828501612204565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61237c81612280565b82525050565b600061238e8383612373565b60208301905092915050565b6000602082019050919050565b60006123b282612347565b6123bc8185612352565b93506123c783612363565b8060005b838110156123f85781516123df8882612382565b97506123ea8361239a565b9250506001810190506123cb565b5085935050505092915050565b6000602082019050818103600083015261241f81846123a7565b905092915050565b60008115159050919050565b61243c81612427565b811461244757600080fd5b50565b60008151905061245981612433565b92915050565b600060208284031215612475576124746119e9565b5b60006124838482850161244a565b91505092915050565b600081905092915050565b82818337600083830152505050565b60006124b2838561248c565b93506124bf838584612497565b82840190509392505050565b60006124d88284866124a6565b91508190509392505050565b6124ed81612280565b81146124f857600080fd5b50565b60008151905061250a816124e4565b92915050565b600060208284031215612526576125256119e9565b5b6000612534848285016124fb565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061257782611db2565b915061258283611db2565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156125b7576125b661253d565b5b828201905092915050565b600082825260208201905092915050565b600080fd5b60006125e483856125c2565b93507f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff831115612617576126166125d3565b5b602083029250612628838584612497565b82840190509392505050565b6000819050919050565b600061264d6020840184612204565b905092915050565b61265e81611bf9565b811461266957600080fd5b50565b60008135905061267b81612655565b92915050565b6000612690602084018461266c565b905092915050565b6126a181611c17565b81146126ac57600080fd5b50565b6000813590506126be81612698565b92915050565b60006126d360208401846126af565b905092915050565b6126e481611c36565b81146126ef57600080fd5b50565b600081359050612701816126db565b92915050565b600061271660208401846126f2565b905092915050565b6080820161272f600083018361263e565b61273c6000850182611bea565b5061274a6020830183612681565b6127576020850182611c08565b5061276560408301836126c4565b6127726040850182611c27565b506127806060830183612707565b61278d6060850182611c52565b50505050565b600061279f838361271e565b60808301905092915050565b600082905092915050565b6000608082019050919050565b60006127cf8385611bc9565b93506127da82612634565b8060005b85811015612813576127f082846127ab565b6127fa8882612793565b9750612805836127b6565b9250506001810190506127de565b5085925050509392505050565b60006080820190506128356000830189611dbc565b6128426020830188612292565b81810360408301526128558186886125d8565b9050818103606083015261286a8184866127c3565b9050979650505050505050565b60006020828403121561288d5761288c6119e9565b5b600061289b848285016126af565b91505092915050565b600081356128b1816121ed565b80915050919050565b60008160001b9050919050565b600060ff6128d4846128ba565b9350801983169250808416831791505092915050565b60006129056129006128fb84611ae4565b611880565b611ae4565b9050919050565b6000819050919050565b61291f826128ea565b61293261292b8261290c565b83546128c7565b8255505050565b6000813561294681612655565b80915050919050565b60008160081b9050919050565b600063ffffff0061296c8461294f565b9350801983169250808416831791505092915050565b600061299d61299861299384611bf9565b611880565b611bf9565b9050919050565b6000819050919050565b6129b782612982565b6129ca6129c3826129a4565b835461295c565b8255505050565b600081356129de81612698565b80915050919050565b60008160201b9050919050565b600067ffffffff00000000612a08846129e7565b9350801983169250808416831791505092915050565b6000612a39612a34612a2f84611c17565b611880565b611c17565b9050919050565b6000819050919050565b612a5382612a1e565b612a66612a5f82612a40565b83546129f4565b8255505050565b60008135612a7a816126db565b80915050919050565b60008160401b9050919050565b600077ffffffffffffffffffffffffffffffff0000000000000000612ab484612a83565b9350801983169250808416831791505092915050565b6000612ae5612ae0612adb84611c36565b611880565b611c36565b9050919050565b6000819050919050565b612aff82612aca565b612b12612b0b82612aec565b8354612a90565b8255505050565b600081016000830180612b2b816128a4565b9050612b378184612916565b505050600081016020830180612b4c81612939565b9050612b5881846129ae565b505050600081016040830180612b6d816129d1565b9050612b798184612a4a565b505050600081016060830180612b8e81612a6d565b9050612b9a8184612af6565b5050505050565b612bab8282612b19565b5050565b600081905092915050565b6000612bc58261192e565b612bcf8185612baf565b9350612bdf81856020860161194a565b80840191505092915050565b6000819050919050565b612c06612c01826118fa565b612beb565b82525050565b6000612c188285612bba565b9150612c248284612bf5565b6020820191508190509392505050565b6000608082019050612c496000830187611904565b612c566020830186611af1565b612c636040830185611904565b612c706060830184611904565b9594505050505056fea26469706673582212204e20478e2e3070a20aa83127753a448e1b78b26fd4b44673d2f1b4027a2cf6be64736f6c634300080d0033", + "devdoc": { + "details": "Main contract for all on-chain data. Check `UmbrellaFeedsReader` to see how to integrate.", + "kind": "dev", + "methods": { + "constructor": { + "params": { + "_contractRegistry": "Registry address", + "_decimals": "decimals for prices stored in this contract", + "_requiredSignatures": "number of required signatures for accepting consensus submission" + } + }, + "destroy(string)": { + "details": "destroys old contract there is sanity check that prevents abuse of destroy method", + "params": { + "_name": "string feed key to verify, that contract was initialised" + } + }, + "getManyPriceData(bytes32[])": { + "details": "it will return array of price datas for provided `_keys` In case ony of feed does not exist, fallback call will be executed for that feed.", + "params": { + "_keys": "array of feed keys" + }, + "returns": { + "data": "PriceData array" + } + }, + "getManyPriceDataRaw(bytes32[])": { + "details": "same as getManyPriceData() but does not revert on empty data." + }, + "getName()": { + "details": "to follow Registrable interface" + }, + "getPrice(bytes32)": { + "params": { + "_key": "hash of feed name" + }, + "returns": { + "price": "price" + } + }, + "getPriceData(bytes32)": { + "details": "this is main endpoint for reading feeds. In case timestamp is empty (that means there is no data), contract will revert. If you do not need whole data from `PriceData` struct, you can save some gas by using other view methods that returns just what you need.", + "params": { + "_key": "hash of feed name" + }, + "returns": { + "data": "full PriceData struct" + } + }, + "getPriceDataByName(string)": { + "details": "This method should be used only for Layer2 as it is more gas consuming than others views.", + "params": { + "_name": "string feed name" + }, + "returns": { + "data": "PriceData" + } + }, + "getPriceTimestamp(bytes32)": { + "params": { + "_key": "hash of feed name" + }, + "returns": { + "price": "price", + "timestamp": "timestamp" + } + }, + "getPriceTimestampHeartbeat(bytes32)": { + "params": { + "_key": "hash of feed name" + }, + "returns": { + "heartbeat": "heartbeat", + "price": "price", + "timestamp": "timestamp" + } + }, + "hashData(bytes32[],(uint8,uint24,uint32,uint128)[])": { + "details": "helper method for QA purposes", + "returns": { + "_0": "hash of data that are signed by validators (keys and priced data)" + } + }, + "prices(bytes32)": { + "params": { + "_key": "hash of feed name" + }, + "returns": { + "data": "full PriceData struct" + } + }, + "recoverSigner(bytes32,uint8,bytes32,bytes32)": { + "params": { + "_hash": "hashed of data", + "_r": "part of signature", + "_s": "part of signature", + "_v": "part of signature" + }, + "returns": { + "_0": "signer address" + } + }, + "update(bytes32[],(uint8,uint24,uint32,uint128)[],(uint8,bytes32,bytes32)[])": { + "details": "method for submitting consensus data", + "params": { + "_priceDatas": "PriceData signed by validators", + "_priceKeys": "array of keys for `_priceDatas`", + "_signatures": "validators signatures" + } + }, + "verifySignatures(bytes32,(uint8,bytes32,bytes32)[])": { + "params": { + "_hash": "hash of signed data", + "_signatures": "array of validators signatures" + } + } + }, + "stateVariables": { + "DECIMALS": { + "details": "decimals for prices stored in this contract" + }, + "DEPLOYED_AT": { + "details": "deployment time, used for protect for unintentional destroy" + }, + "REGISTRY": { + "details": "Registry contract where list of all addresses is stored. Fallback feature uses this registry to resolve newest `UmbrellaFeeds` address" + }, + "REQUIRED_SIGNATURES": { + "details": "minimal number of signatures required for accepting price submission (PoA)" + }, + "STAKING_BANK": { + "details": "StakingBank contract where list of validators is stored" + } + }, + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": { + "getManyPriceData(bytes32[])": { + "notice": "If data for any key not exists, function will revert. Use `getManyPriceDataRaw` method if you don't want revert." + }, + "getManyPriceDataRaw(bytes32[])": { + "notice": "This method does no revert if some data does not exists. Check `data.timestamp` to see if price exist, if it is 0, then it does not exist." + }, + "getPrice(bytes32)": { + "notice": "method will revert if data for `_key` not exists." + }, + "getPriceData(bytes32)": { + "notice": "method will revert if data for `_key` not exists." + }, + "getPriceDataByName(string)": { + "notice": "It does not revert on empty data." + }, + "getPriceTimestamp(bytes32)": { + "notice": "method will revert if data for `_key` not exists." + }, + "getPriceTimestampHeartbeat(bytes32)": { + "notice": "method will revert if data for `_key` not exists." + }, + "prices(bytes32)": { + "notice": "reader for mapping" + } + }, + "notice": "This contract can be destroyed and replaced with new one (with new address). For best gas efficiency you should pick one of two ways of integration: 1. make `UmbrellaFeeds` immutable and use fallback in case of selfdestruct. After new deployment, it is recommended to update address to avoid fallback and reduce gas cost to minimum. In long run this is most efficient solution, better than any proxy. 2. always check newest `UmbrellaFeeds` via `Regostry` and fallback will not be needed.", + "version": 1 + }, + "storageLayout": { + "storage": [ + { + "astId": 4270, + "contract": "contracts/onChainFeeds/UmbrellaFeeds.sol:UmbrellaFeeds", + "label": "_prices", + "offset": 0, + "slot": "0", + "type": "t_mapping(t_bytes32,t_struct(PriceData)3396_storage)" + } + ], + "types": { + "t_bytes32": { + "encoding": "inplace", + "label": "bytes32", + "numberOfBytes": "32" + }, + "t_mapping(t_bytes32,t_struct(PriceData)3396_storage)": { + "encoding": "mapping", + "key": "t_bytes32", + "label": "mapping(bytes32 => struct IUmbrellaFeeds.PriceData)", + "numberOfBytes": "32", + "value": "t_struct(PriceData)3396_storage" + }, + "t_struct(PriceData)3396_storage": { + "encoding": "inplace", + "label": "struct IUmbrellaFeeds.PriceData", + "members": [ + { + "astId": 3386, + "contract": "contracts/onChainFeeds/UmbrellaFeeds.sol:UmbrellaFeeds", + "label": "data", + "offset": 0, + "slot": "0", + "type": "t_uint8" + }, + { + "astId": 3389, + "contract": "contracts/onChainFeeds/UmbrellaFeeds.sol:UmbrellaFeeds", + "label": "heartbeat", + "offset": 1, + "slot": "0", + "type": "t_uint24" + }, + { + "astId": 3392, + "contract": "contracts/onChainFeeds/UmbrellaFeeds.sol:UmbrellaFeeds", + "label": "timestamp", + "offset": 4, + "slot": "0", + "type": "t_uint32" + }, + { + "astId": 3395, + "contract": "contracts/onChainFeeds/UmbrellaFeeds.sol:UmbrellaFeeds", + "label": "price", + "offset": 8, + "slot": "0", + "type": "t_uint128" + } + ], + "numberOfBytes": "32" + }, + "t_uint128": { + "encoding": "inplace", + "label": "uint128", + "numberOfBytes": "16" + }, + "t_uint24": { + "encoding": "inplace", + "label": "uint24", + "numberOfBytes": "3" + }, + "t_uint32": { + "encoding": "inplace", + "label": "uint32", + "numberOfBytes": "4" + }, + "t_uint8": { + "encoding": "inplace", + "label": "uint8", + "numberOfBytes": "1" + } + } + } +} \ No newline at end of file diff --git a/src/controllers/OnChainReportsController.ts b/src/controllers/OnChainReportsController.ts new file mode 100644 index 00000000..acd1dedf --- /dev/null +++ b/src/controllers/OnChainReportsController.ts @@ -0,0 +1,163 @@ +import { inject, injectable, postConstruct } from 'inversify'; +import { Request, Response, Router } from 'express'; +import { ethers } from 'ethers'; +import { Logger } from 'winston'; + +import { UpdateTxRepository } from '../repositories/UpdateTxRepository'; +import { ChainsIds } from '../types/ChainsIds'; +import { IUpdateTx } from '../models/UpdateTx'; +import { PriceDataRepository } from '../repositories/PriceDataRepository'; + +type UpdateTxData = { + failed: number; + successfulUpdates: number; + signatures: number; + gasSuccess: bigint; + gasFail: bigint; +}; + +@injectable() +export class OnChainReportsController { + @inject('Logger') private logger: Logger; + @inject(UpdateTxRepository) private updateTxRepository!: UpdateTxRepository; + @inject(PriceDataRepository) private priceDataRepository!: PriceDataRepository; + + router: Router; + + @postConstruct() + setup(): void { + this.router = Router() + .get('/monthly-expenses/:chainId/:year/:month', this.monthlyExpenses) + .get('/price-history/:key', this.priceHistory) + .get('/price-history/:chainId/:key', this.priceHistory); + } + + priceHistory = async (request: Request, response: Response): Promise => { + const chainId = request.params.chainId as ChainsIds; + const key = request.params.key; + + try { + const prices = await this.priceDataRepository.lastPrices(chainId, key, 7); + response + // .type('application/text') + .send(prices); + } catch (e) { + this.logger.error(e); + response.status(500).send(e.message); + } + }; + + monthlyExpenses = async (request: Request, response: Response): Promise => { + const chainId = request.params.chainId as ChainsIds; + + if (!Object.values(ChainsIds).includes(chainId)) { + const msg = `expect chainId to be one of ${Object.values(ChainsIds)}, got ${chainId}`; + this.logger.error(msg); + response.status(500).send(msg); + return; + } + + const year = parseInt(request.params.year); + + if (year < 2024 || year > 2300) { + const msg = `expect year to be between 2024 - 2300, got ${year}`; + this.logger.error(msg); + response.status(500).send(msg); + return; + } + + const month = parseInt(request.params.month); + + if (month < 1 || month > 12) { + const msg = `expect month to be between 1 - 12, got ${month}`; + this.logger.error(msg); + response.status(500).send(msg); + return; + } + + try { + const txs = await this.updateTxRepository.findMonthlyTx(chainId, year, month); + response + // .type('application/text') + .send(this.processMonthlyExpenses(txs)); + } catch (e) { + this.logger.error(e); + response.status(500).send(e.message); + } + }; + + /* +[ + 'wallet: who submit', + 'failed tx', + 'submits for blocks: range of blocks for which query was done', + 'signatures: how many signatures validator did (excluding cases when he is leader)', + 'wei: gas spend in wei', + 'fail wei: gas spend for failed tx', + 'validator: address of signer (this address is registered in bank)' +] + +if validator did not submit any tx, it will not be included in report, even if he might sign + +*/ + private processMonthlyExpenses = (txs: IUpdateTx[]): string => { + const results: Record = {}; + let blockMin = Number.MAX_SAFE_INTEGER; + let blockMax = 0; + + txs.forEach((tx) => { + blockMin = Math.min(blockMin, tx.blockNumber); + blockMax = Math.max(blockMax, tx.blockNumber); + this.processTx(tx, results); + }); + + const records = Object.keys(results).map((sender) => { + const { failed, gasFail, gasSuccess, successfulUpdates, signatures } = results[sender]; + const totalWei = ethers.utils.formatEther(gasFail + gasSuccess); + return [sender, failed, successfulUpdates, signatures, gasFail, gasSuccess, totalWei].join(';'); + }); + + const labels = [ + 'wallet', + 'failed tx', + `submits for blocks ${blockMin} - ${blockMax}`, + 'signatures', + 'failed gas', + 'success gas', + 'total gas', + ]; + + return `${labels.join(';')}\n${records.join('
\n')}`; + }; + + private processTx = (tx: IUpdateTx, results: Record): void => { + if (!results[tx.sender]) { + this.resetRecord(results, tx.sender); + } + + if (tx.success) { + results[tx.sender].successfulUpdates++; + results[tx.sender].gasSuccess += BigInt(tx.fee); + } else { + results[tx.sender].failed++; + results[tx.sender].gasFail += BigInt(tx.fee); + } + + tx.signers.forEach((s) => { + if (!results[s]) this.resetRecord(results, s); + results[s].signatures++; + }); + }; + + private resetRecord = (results: Record, key: string): void => { + if (!results[key]) { + results[key] = { + failed: 0, + gasFail: 0n, + gasSuccess: 0n, + successfulUpdates: 0, + signatures: 0, + }; + } + }; +} diff --git a/src/factories/BlockchainScannerFactory.ts b/src/factories/BlockchainScannerFactory.ts new file mode 100644 index 00000000..8e9877b8 --- /dev/null +++ b/src/factories/BlockchainScannerFactory.ts @@ -0,0 +1,13 @@ +import { injectable } from 'inversify'; +import { IGenericBlockchain, GenericBlockchainProps } from '../lib/blockchains/IGenericBlockchain'; +import { BlockchainScanner } from '../lib/BlockchainScanner'; + +@injectable() +export class BlockchainScannerFactory { + static create(props: GenericBlockchainProps): IGenericBlockchain | BlockchainScanner { + switch (props.chainId) { + default: + return new BlockchainScanner(props); + } + } +} diff --git a/src/lib/BlockchainScanner.ts b/src/lib/BlockchainScanner.ts new file mode 100644 index 00000000..0b8eb7cc --- /dev/null +++ b/src/lib/BlockchainScanner.ts @@ -0,0 +1,46 @@ +import { BigNumber, ethers } from 'ethers'; +import Settings, { OnChainScannerSettings } from '../types/Settings'; + +export type BlockchainProps = { + chainId: string; + settings: Settings; +}; + +export class BlockchainScanner { + readonly chainId!: string; + readonly settings!: OnChainScannerSettings; + readonly provider: ethers.providers.StaticJsonRpcProvider; + + constructor(props: BlockchainProps) { + const { chainId, settings } = props; + + this.chainId = chainId; + this.settings = (>settings.blockchain.blockchainScanner)[chainId]; + + if (!this.settings.providerUrl) { + return; + } + + if (!this.settings.contractRegistryAddress) { + throw Error(`[BlockchainScanner] missing contractRegistryAddress for ${chainId}`); + } + + this.provider = new ethers.providers.StaticJsonRpcProvider(this.settings.providerUrl); + } + + getProvider(): ethers.providers.Provider { + return this.provider; + } + + async getBlockNumber(): Promise { + return this.provider.getBlockNumber(); + } + + async balanceOf(address: string): Promise { + return this.provider.getBalance(address); + } + + getContractRegistryAddress(): string { + return this.settings.contractRegistryAddress; + } +} diff --git a/src/lib/Server.ts b/src/lib/Server.ts index a0f884f4..d1cbce74 100644 --- a/src/lib/Server.ts +++ b/src/lib/Server.ts @@ -25,6 +25,7 @@ import { Logger } from 'winston'; import swaggerDocument from '../config/swagger.json'; import internalSwaggerDocument from '../config/swagger-internal.json'; import SignatureController from '../controllers/SignatureController'; +import { OnChainReportsController } from '../controllers/OnChainReportsController'; @injectable() class Server { @@ -48,7 +49,8 @@ class Server { @inject(ProjectsController) projectsController: ProjectsController, @inject(InfoController) infoController: InfoController, @inject(ProfileController) profileController: ProfileController, - @inject(SignatureController) signatureController: SignatureController + @inject(SignatureController) signatureController: SignatureController, + @inject(OnChainReportsController) onChainReportsController: OnChainReportsController ) { this.port = settings.port; this.logger = logger; @@ -74,6 +76,7 @@ class Server { .use('/info', infoController.router) .use('/profile', profileController.router) .use('/signatures', signatureController.router) + .use('/reports/on-chain', onChainReportsController.router) .use(this.authErrorHandler) .use(this.generalErrorHandler); diff --git a/src/lib/getContainer.ts b/src/lib/getContainer.ts index 4e9805be..4d3aef61 100644 --- a/src/lib/getContainer.ts +++ b/src/lib/getContainer.ts @@ -1,17 +1,29 @@ import { Container } from 'inversify'; +import { Redis } from 'ioredis'; +import { Logger } from 'winston'; +import { ManagementClient } from 'auth0'; import Settings from '../types/Settings'; import settings from '../config/settings'; -import { Redis } from 'ioredis'; import buildRedisConnection from '../utils/buildRedisConnection'; -import { Logger } from 'winston'; import { Blockchain } from './Blockchain'; import { ProjectAuthUtils } from '../services/ProjectAuthUtils'; import LockRepository from '../repositories/LockRepository'; import { BlockchainRepository } from '../repositories/BlockchainRepository'; import { ChainContractRepository } from '../repositories/ChainContractRepository'; -import { ManagementClient } from 'auth0'; import { initAuth0ManagementClient } from '../config/initAuth0ManagementClient'; import { getLogger } from './getLogger'; +import { BlockchainScanner } from './BlockchainScanner'; +import { BlockchainScannerRepository } from '../repositories/BlockchainScannerRepository'; +import { ContractSynchronizer } from '../services/ContractSynchronizer'; +import ChainSynchronizer from '../services/ChainSynchronizer'; +import { RegisteredContractRepository } from '../repositories/RegisteredContractRepository'; +import { BaseTxReceiptFetcher } from '../services/on-chain-stats/BaseTxReceiptFetcher'; +import { TxReceiptFetcher } from '../services/on-chain-stats/TxReceiptFetcher'; +import { UpdateTxRepository } from '../repositories/UpdateTxRepository'; +import { GasCalculatorEvm } from '../services/on-chain-stats/GasCalculatorEvm'; +import { GasCalculator } from '../services/on-chain-stats/GasCalculator'; +import { KeysUpdateService } from '../services/on-chain-stats/KeysUpdateService'; +import { FeedKeyRepository } from '../repositories/FeedKeyRepository'; export function getContainer(): Container { const container = new Container({ autoBindInjectable: true }); @@ -37,9 +49,21 @@ export function getContainer(): Container { .inSingletonScope(); container.bind(Blockchain).toSelf().inSingletonScope(); + container.bind(BlockchainScanner).toSelf().inSingletonScope(); container.bind(ProjectAuthUtils).toSelf().inSingletonScope(); container.bind(LockRepository).toSelf().inSingletonScope(); container.bind(BlockchainRepository).toSelf().inSingletonScope(); + container.bind(BlockchainScannerRepository).toSelf().inSingletonScope(); + container.bind(ContractSynchronizer).toSelf().inSingletonScope(); + container.bind(ChainSynchronizer).toSelf().inSingletonScope(); container.bind(ChainContractRepository).toSelf().inSingletonScope(); + container.bind(RegisteredContractRepository).toSelf().inSingletonScope(); + container.bind(BaseTxReceiptFetcher).toSelf().inSingletonScope(); + container.bind(TxReceiptFetcher).toSelf().inSingletonScope(); + container.bind(UpdateTxRepository).toSelf().inSingletonScope(); + container.bind(GasCalculatorEvm).toSelf().inSingletonScope(); + container.bind(GasCalculator).toSelf().inSingletonScope(); + container.bind(KeysUpdateService).toSelf().inSingletonScope(); + container.bind(FeedKeyRepository).toSelf().inSingletonScope(); return container; } diff --git a/src/models/FeedKey.ts b/src/models/FeedKey.ts new file mode 100644 index 00000000..07092c7f --- /dev/null +++ b/src/models/FeedKey.ts @@ -0,0 +1,12 @@ +import mongoose, { Schema, Document } from 'mongoose'; + +export interface IFeedKey extends Document { + key: string; +} + +const FeedKey: Schema = new Schema({ + _id: { type: String, required: true }, + key: { type: String, required: true }, +}); + +export default mongoose.model('FeedKey', FeedKey); diff --git a/src/models/PriceData.ts b/src/models/PriceData.ts new file mode 100644 index 00000000..195381cd --- /dev/null +++ b/src/models/PriceData.ts @@ -0,0 +1,30 @@ +import mongoose, { Schema, Document } from 'mongoose'; + +export interface IPriceData extends Document { + tx: string; + chainId: string; + key: string; + value: string; + heartbeat: number; + timestamp: number; + data: string; +} + +const PriceData: Schema = new Schema({ + _id: { type: String, required: true }, + tx: { type: String, required: true }, + chainId: { type: String, required: true }, + key: { type: String, required: true }, + value: { type: String, required: true }, + heartbeat: { type: Number, required: true }, + timestamp: { type: Number, required: true }, + data: { type: String }, +}); + +PriceData.index({ tx: 1 }); +PriceData.index({ timestamp: 1 }); +PriceData.index({ timestamp: -1 }); +PriceData.index({ chainId: 1 }); +PriceData.index({ key: 1 }); + +export default mongoose.model('PriceData', PriceData); diff --git a/src/models/RegisteredContracts.ts b/src/models/RegisteredContracts.ts index 57d6b4d6..c3ce13e9 100644 --- a/src/models/RegisteredContracts.ts +++ b/src/models/RegisteredContracts.ts @@ -4,6 +4,7 @@ export interface IRegisteredContracts extends Document { address: string; anchor: number; chainId: string; + name: string; } const RegisteredContractsSchema: Schema = new Schema({ @@ -11,11 +12,13 @@ const RegisteredContractsSchema: Schema = new Schema({ address: { type: String, required: true }, anchor: { type: Number, required: true }, chainId: { type: String, required: true }, + name: { type: String, required: true }, }); RegisteredContractsSchema.index({ anchor: -1 }); RegisteredContractsSchema.index({ anchor: 1 }); RegisteredContractsSchema.index({ chainId: 1 }); +RegisteredContractsSchema.index({ name: 1 }); RegisteredContractsSchema.index({ address: 1, chainId: 1 }, { unique: true }); export default mongoose.model('RegisteredContracts', RegisteredContractsSchema); diff --git a/src/models/UpdateTx.ts b/src/models/UpdateTx.ts new file mode 100644 index 00000000..94dabd82 --- /dev/null +++ b/src/models/UpdateTx.ts @@ -0,0 +1,33 @@ +import mongoose, { Schema, Document } from 'mongoose'; + +export interface IUpdateTx extends Document { + txTimestamp: Date; + chainId: string; + feedsAddress: string; + blockNumber: number; + success: boolean; + sender: string; + signers: string[]; + fee: string; + kees: string[]; +} + +const UpdateTx: Schema = new Schema({ + _id: { type: String, required: true }, // tx hash + txTimestamp: { type: Date, required: true }, + chainId: { type: String, required: true, unique: false }, + feedsAddress: { type: String, required: true, unique: false }, + blockNumber: { type: Number, required: true }, + success: { type: Boolean, required: true, default: false }, + sender: { type: String, required: true }, + signers: { type: [String], required: true, default: [] }, + fee: { type: String, required: true }, + kees: { type: [String], required: true, default: [] }, +}); + +UpdateTx.index({ blockNumber: -1 }); +UpdateTx.index({ blockNumber: 1 }); +UpdateTx.index({ chainId: 1 }); +UpdateTx.index({ txTimestamp: 1 }); + +export default mongoose.model('UpdateTx', UpdateTx); diff --git a/src/repositories/BlockchainScannerRepository.ts b/src/repositories/BlockchainScannerRepository.ts new file mode 100644 index 00000000..77d1cd31 --- /dev/null +++ b/src/repositories/BlockchainScannerRepository.ts @@ -0,0 +1,33 @@ +import { inject, injectable } from 'inversify'; +import { IGenericBlockchain } from '../lib/blockchains/IGenericBlockchain'; +import Settings from '../types/Settings'; +import { ChainsIds, NonEvmChainsIds } from '../types/ChainsIds'; +import { BlockchainScannerFactory } from '../factories/BlockchainScannerFactory'; +import { BlockchainScanner } from '../lib/BlockchainScanner'; + +export type BlockchainCollection = { + [key: string]: BlockchainScanner | IGenericBlockchain; +}; + +@injectable() +export class BlockchainScannerRepository { + private collection: BlockchainCollection = {}; + + constructor(@inject('Settings') settings: Settings) { + Object.keys(settings.blockchain.blockchainScanner).forEach((chainId) => { + this.collection[chainId] = BlockchainScannerFactory.create({ chainId: chainId as ChainsIds, settings }); + }); + } + + get(id: string): BlockchainScanner { + if (!this.collection[id]) { + throw Error(`[BlockchainScannerRepository] BlockchainScanner ${id} does not exists`); + } + + if (NonEvmChainsIds.includes(id)) { + throw Error(`[BlockchainScannerRepository] Wrong BlockchainScanner type for ${id}`); + } + + return this.collection[id]; + } +} diff --git a/src/repositories/FeedKeyRepository.ts b/src/repositories/FeedKeyRepository.ts new file mode 100644 index 00000000..2372809f --- /dev/null +++ b/src/repositories/FeedKeyRepository.ts @@ -0,0 +1,44 @@ +import { injectable } from 'inversify'; +import { ethers } from 'ethers'; + +import FeedKey from '../models/FeedKey'; + +@injectable() +export class FeedKeyRepository { + async getAllByKey(): Promise> { + const map: Record = {}; + const all = await FeedKey.find().exec(); + + all.forEach((data) => { + map[data.key] = data.id; + }); + + return map; + } + + async getAllByHash(): Promise> { + const map: Record = {}; + const all = await FeedKey.find().exec(); + + all.forEach((data) => { + map[data.id] = data.key; + }); + + return map; + } + + async save(key: string): Promise { + await FeedKey.findOneAndUpdate( + { + _id: ethers.utils.id(key), + }, + { + key, + }, + { + new: true, + upsert: true, + } + ); + } +} diff --git a/src/repositories/PriceDataRepository.ts b/src/repositories/PriceDataRepository.ts new file mode 100644 index 00000000..bffd4fc2 --- /dev/null +++ b/src/repositories/PriceDataRepository.ts @@ -0,0 +1,43 @@ +import { injectable } from 'inversify'; + +import { ChainsIds } from '../types/ChainsIds'; +import { FeedsPriceData } from '../types/UpdateInput'; +import PriceData, { IPriceData } from '../models/PriceData'; +import { FilterQuery } from 'mongoose'; + +@injectable() +export class PriceDataRepository { + async deleteMany(txHash: string): Promise { + await PriceData.deleteMany({ tx: txHash }); + } + + async lastPrices(chainId: ChainsIds | undefined, key: string, days: number): Promise { + const from = new Date(Date.now() - days * 24 * 60 * 60 * 1000); + const filter: FilterQuery = { key, timestamp: { $gte: from.getTime() / 1000 } }; + if (chainId) filter['chainId'] = chainId; + return PriceData.find(filter).sort({ timestamp: 1 }).exec(); + } + + async save(chainId: ChainsIds, txHash: string, key: string, data: FeedsPriceData): Promise { + await PriceData.findOneAndUpdate( + { + _id: `${chainId}::${key}::${data.timestamp}`, + }, + { + tx: txHash, + chainId, + key, + value: data.price.toString(), + heartbeat: data.heartbeat, + timestamp: data.timestamp, + data: data.data, + }, + { + new: true, + upsert: true, + } + ); + + return true; + } +} diff --git a/src/repositories/RegisteredContractRepository.ts b/src/repositories/RegisteredContractRepository.ts new file mode 100644 index 00000000..842d262c --- /dev/null +++ b/src/repositories/RegisteredContractRepository.ts @@ -0,0 +1,42 @@ +import { injectable } from 'inversify'; + +import RegisteredContracts, { IRegisteredContracts } from '../models/RegisteredContracts'; +import { ChainsIds } from '../types/ChainsIds'; + +@injectable() +export class RegisteredContractRepository { + instanceId(chainId: string, contractName: string, address: string): string { + return `${contractName}::${chainId}::${address}`; + } + + async save(chainId: string, anchor: number, contractName: string, address: string): Promise { + return RegisteredContracts.findOneAndUpdate( + { + _id: this.instanceId(chainId, contractName, address), + }, + { + anchor, + address, + chainId, + name: contractName, + }, + { + new: true, + upsert: true, + } + ); + } + + async get(id: string): Promise { + return RegisteredContracts.findById(id); + } + + async getAllContracts(chainId: ChainsIds, name: string): Promise { + return RegisteredContracts.find({ chainId, name }).exec(); + } + + async getLastSavedAnchor(): Promise { + const records = await RegisteredContracts.find().limit(1).sort({ anchor: -1 }).exec(); + return records[0] ? records[0].anchor : undefined; + } +} diff --git a/src/repositories/UpdateTxRepository.ts b/src/repositories/UpdateTxRepository.ts new file mode 100644 index 00000000..694e64c4 --- /dev/null +++ b/src/repositories/UpdateTxRepository.ts @@ -0,0 +1,111 @@ +import { inject, injectable } from 'inversify'; +import { TransactionReceipt, TransactionResponse } from '@ethersproject/providers'; +import InputDataDecoder from 'ethereum-input-data-decoder'; +import { Logger } from 'winston'; + +import { ChainsIds } from '../types/ChainsIds'; +import UpdateTx, { IUpdateTx } from '../models/UpdateTx'; +import { abi } from '../contracts/UmbrellaFeeds.json'; +import { FeedsPriceData, UpdateData, UpdateInput } from '../types/UpdateInput'; +import { GasCalculator } from '../services/on-chain-stats/GasCalculator'; +import { SignersRecoveryEvm } from '../services/on-chain-stats/SignerRecovery'; +import { PriceDataRepository } from './PriceDataRepository'; +import { FeedKeyRepository } from './FeedKeyRepository'; + +@injectable() +export class UpdateTxRepository { + @inject('Logger') private logger!: Logger; + @inject(GasCalculator) private gasCalculator: GasCalculator; + @inject(PriceDataRepository) private priceDataRepository: PriceDataRepository; + @inject(FeedKeyRepository) private feedKeyRepository: FeedKeyRepository; + + async saveUpdates( + chainId: ChainsIds, + networkId: number, + tx: TransactionResponse, + receipt: TransactionReceipt + ): Promise { + const decoder = new InputDataDecoder(abi); + const decodeData = decoder.decodeData(tx.data); + + if (decodeData.method != 'update') { + this.logger.info(`[UpdateTxRepository] '${decodeData.method}' method is ignored`); + return true; + } + + const updateData = this.toUpdateData((decodeData.inputs as unknown) as UpdateInput); + const existingKeys = await this.feedKeyRepository.getAllByHash(); + + const prettyKeys = updateData.keys.map((hash) => { + const name = existingKeys[hash]; + if (!name) throw new Error(`[UpdateTxRepository] can not find name for hash ${hash}`); + return name; + }); + + await UpdateTx.findOneAndUpdate( + { + _id: tx.hash, + }, + { + txTimestamp: new Date(tx.timestamp * 1000), + chainId, + feedsAddress: tx.to, + blockNumber: tx.blockNumber, + success: !!receipt.status, + sender: tx.from, + signers: SignersRecoveryEvm.apply(networkId, tx.to, updateData), + fee: this.gasCalculator.apply(chainId, receipt).toString(10), + kees: prettyKeys, + }, + { + new: true, + upsert: true, + } + ); + + try { + await Promise.all( + prettyKeys.map((key, i) => this.priceDataRepository.save(chainId, tx.hash, key, updateData.priceDatas[i])) + ); + } catch (e) { + this.logger.error(`[UpdateTxRepository] ${e.message}`); + await UpdateTx.deleteOne({ _id: tx.hash }); + await this.priceDataRepository.deleteMany(tx.hash); + return false; + } + + this.logger.info(`[UpdateTxRepository] saved update data for tx ${tx.hash}`); + return true; + } + + async getBlocks(chainId: ChainsIds, from: number, to: number): Promise { + const records = await UpdateTx.find({ chainId, blockNumber: { $gte: from, $lte: to } }).exec(); + return records.map((r) => r.blockNumber); + } + + async findMonthlyTx(chainId: ChainsIds, year: number, month: number): Promise { + const from = new Date(`${year}-${month}-01`); + const nextY = year + (month == 12 ? 1 : 0); + const nextM = month == 12 ? 1 : month + 1; + const to = new Date(`${nextY}-${nextM.toString(10).padStart(2, '0')}-01`); + + return UpdateTx.find({ chainId, txTimestamp: { $gte: from, $lt: to } }).exec(); + } + + private toUpdateData(data: UpdateInput): UpdateData { + return { + keys: data[0], + priceDatas: data[1].map((d) => { + return { + data: d[0].toString(16), + heartbeat: d[1], + timestamp: d[2], + price: BigInt(d[3].toString()), + }; + }), + signatures: data[2].map(([v, r, s]) => { + return { v, r, s }; + }), + }; + } +} diff --git a/src/services/ChainSynchronizer.ts b/src/services/ChainSynchronizer.ts index cba27647..addc3cbd 100644 --- a/src/services/ChainSynchronizer.ts +++ b/src/services/ChainSynchronizer.ts @@ -59,7 +59,7 @@ class ChainSynchronizer { try { currentChainAddress = await registry.getAddress(CHAIN_CONTRACT_NAME); } catch (e) { - this.logger.info(`[${chainId}] unable to get address. Trying provider again`); + this.logger.error(`[${chainId}] unable to get ${CHAIN_CONTRACT_NAME} address. Trying provider again`); currentChainAddress = await registry.getAddress(CHAIN_CONTRACT_NAME); } diff --git a/src/services/ContractSynchronizer.ts b/src/services/ContractSynchronizer.ts index 358ee137..0ff509de 100644 --- a/src/services/ContractSynchronizer.ts +++ b/src/services/ContractSynchronizer.ts @@ -7,12 +7,12 @@ import type { queueAsPromised } from 'fastq'; import { LogRegistered } from '../types/events'; import { CreateBatchRanges } from './CreateBatchRanges'; -import Settings from '../types/Settings'; -import { BlockchainRepository } from '../repositories/BlockchainRepository'; import { ChainsIds } from '../types/ChainsIds'; import { MappingRepository } from '../repositories/MappingRepository'; import { LAST_BLOCK_CHECKED_FOR_NEW_CONTRACT } from '../constants/mappings'; import RegisteredContracts, { IRegisteredContracts } from '../models/RegisteredContracts'; +import { BlockchainScannerRepository } from '../repositories/BlockchainScannerRepository'; +import { RegisteredContractRepository } from '../repositories/RegisteredContractRepository'; type SyncChainTask = { batchFrom: number; @@ -28,26 +28,30 @@ type FreshContracts = { @injectable() export class ContractSynchronizer { @inject('Logger') private logger!: Logger; - @inject('Settings') private settings: Settings; - @inject(BlockchainRepository) private blockchainRepository!: BlockchainRepository; + @inject(BlockchainScannerRepository) private blockchainScannerRepository!: BlockchainScannerRepository; @inject(MappingRepository) private mappingRepository: MappingRepository; + @inject(RegisteredContractRepository) private contractRepository: RegisteredContractRepository; + + apply = async (chainId: ChainsIds, contracts: string[]): Promise<{ lastSyncedBlock: number }> => { + let lastSyncedBlock = 0; - apply = async (chainId: ChainsIds, contracts: string[]): Promise => { if (chainId === ChainsIds.SOLANA) { - return; + return { lastSyncedBlock }; } - const blockchain = this.blockchainRepository.get(chainId); + const blockchainScanner = this.blockchainScannerRepository.get(chainId); - if (!blockchain.settings.registryScannerStartingBlock) { - return; + if (!blockchainScanner.settings.startBlockNumber) { + return { lastSyncedBlock }; } - const blockNumber = await blockchain.getBlockNumber(); + const blockNumber = await blockchainScanner.getBlockNumber(); + const lastCheckedBlock = await this.mappingRepository.get(LAST_BLOCK_CHECKED_FOR_NEW_CONTRACT(chainId)); - if (!(await this.readyForFullBatch(chainId, blockNumber, blockchain.settings.scanBatchSize))) { + if (!this.readyForFullBatch(chainId, blockNumber, lastCheckedBlock, blockchainScanner.settings.scanBatchSize)) { this.logger.debug(`[${chainId}] not ready for full batch`); - return; + lastSyncedBlock = lastCheckedBlock ? parseInt(lastCheckedBlock, 10) : blockchainScanner.settings.startBlockNumber; + return { lastSyncedBlock }; } const upToDate = await this.contractsUpToDate(chainId, contracts); @@ -55,16 +59,18 @@ export class ContractSynchronizer { if (upToDate.upToDate) { await this.mappingRepository.set(LAST_BLOCK_CHECKED_FOR_NEW_CONTRACT(chainId), blockNumber.toString(10)); this.logger.info(`[${chainId}] contracts up to date.`); - return; + return { lastSyncedBlock: blockNumber }; } this.logger.info(`[${chainId}] contracts not up to date.`); await this.synchronizeContracts(chainId, blockNumber, contracts); - if ((await this.getLastSavedAnchor()) < 0) { + if (!(await this.contractRepository.getLastSavedAnchor())) { this.logger.info(`[${chainId}] scanning finished but nothing found.`); - await this.saveInitialContracts(chainId, upToDate.list, blockchain.settings.registryScannerStartingBlock); + await this.saveInitialContracts(chainId, upToDate.list, blockchainScanner.settings.startBlockNumber); } + + return { lastSyncedBlock: blockNumber }; }; private contractsUpToDate = async ( @@ -81,19 +87,21 @@ export class ContractSynchronizer { private contractUpToDate = async (chainId: string, contractName: string): Promise => { this.logger.debug(`[${chainId}] checking if ${contractName} up to date.`); - const blockchain = this.blockchainRepository.get(chainId); - const registry = new ContractRegistry(blockchain.getProvider(), blockchain.getContractRegistryAddress()); + const blockchain = this.blockchainScannerRepository.get(chainId); + // const registry = new ContractRegistry(blockchain.getProvider(), blockchain.getContractRegistryAddress()); + // TODO temporary prod + const registry = new ContractRegistry(blockchain.getProvider(), '0x4A28406ECE8fFd7A91789738a5ac15DAc44bFa1b'); let currentAddress; try { currentAddress = await registry.getAddress(contractName); } catch (e) { - this.logger.info(`[${chainId}] unable to get address for ${contractName}. Trying provider again`); + this.logger.error(`[${chainId}] unable to get address for ${contractName}. Trying provider again`); currentAddress = await registry.getAddress(contractName); } - const id = ContractSynchronizer.contractInstanceId(chainId, contractName, currentAddress); + const id = this.contractRepository.instanceId(chainId, contractName, currentAddress); const results = await RegisteredContracts.findById(id); if (results) { @@ -108,24 +116,27 @@ export class ContractSynchronizer { currentBlockNumber: number, contracts: string[] ): Promise => { - const blockchain = this.blockchainRepository.get(chainId); + const blockchainScanner = this.blockchainScannerRepository.get(chainId); const [fromBlock, toBlock] = await this.calculateBlockNumberRange( chainId, - blockchain.settings.registryScannerStartingBlock, + blockchainScanner.settings.startBlockNumber, currentBlockNumber, - blockchain.settings.confirmations + blockchainScanner.settings.confirmations ); this.logger.info(`[${chainId}] Synchronizing contracts @${currentBlockNumber}: ${fromBlock} - ${toBlock}`); - const ranges = CreateBatchRanges.apply(fromBlock, toBlock, blockchain.settings.scanBatchSize); + const ranges = CreateBatchRanges.apply(fromBlock, toBlock, blockchainScanner.settings.scanBatchSize); const worker = async (task: SyncChainTask) => { await this.synchronizeContractsForBatch(chainId, task.batchFrom, task.batchTo, contracts); }; - const queue: queueAsPromised = fastq.promise(worker, blockchain.settings.maxRequestConcurrency); + const queue: queueAsPromised = fastq.promise( + worker, + blockchainScanner.settings.maxRequestConcurrency + ); ranges.map(([batchFrom, batchTo]) => { queue.push({ batchFrom, batchTo }); @@ -151,21 +162,7 @@ export class ContractSynchronizer { const { destination, anchor, bytes32 } = logRegistered; const [name] = Buffer.from(bytes32.replace('0x', ''), 'hex').toString().split(']x00'); this.logger.info(`[${chainId}] Detected new ${name}: ${destination} at ${anchor}`); - - return RegisteredContracts.findOneAndUpdate( - { - _id: ContractSynchronizer.contractInstanceId(chainId, name, destination), - }, - { - anchor: anchor, - address: destination, - chainId: chainId, - }, - { - new: true, - upsert: true, - } - ); + return this.contractRepository.save(chainId, anchor, name, destination); }) ); }; @@ -180,11 +177,11 @@ export class ContractSynchronizer { const [lastCheckBlockCached, lastSavedAnchor] = await Promise.all([ this.mappingRepository.get(LAST_BLOCK_CHECKED_FOR_NEW_CONTRACT(chainId)), - this.getLastSavedAnchor(), + this.contractRepository.getLastSavedAnchor(), ]); let lastAnchor = lastCheckBlockCached - ? Math.max(lastSavedAnchor, parseInt(lastCheckBlockCached, 10)) + ? Math.max(lastSavedAnchor ?? -1, parseInt(lastCheckBlockCached, 10)) : lastSavedAnchor; lastAnchor -= confirmations; @@ -208,17 +205,12 @@ export class ContractSynchronizer { return [fromBlock + 1, endBlockNumber]; }; - private getLastSavedAnchor = async (): Promise => { - const records = await RegisteredContracts.find().limit(1).sort({ anchor: -1 }).exec(); - return records[0] ? records[0].anchor : -1; - }; - - private readyForFullBatch = async ( + private readyForFullBatch = ( chainId: ChainsIds, currentBlockNumber: number, + lastCheckedBlock: string | undefined, batchSize: number - ): Promise => { - const lastCheckedBlock = await this.mappingRepository.get(LAST_BLOCK_CHECKED_FOR_NEW_CONTRACT(chainId)); + ): boolean => { return lastCheckedBlock ? currentBlockNumber - parseInt(lastCheckedBlock, 10) > batchSize : true; }; @@ -228,7 +220,7 @@ export class ContractSynchronizer { toBlock: number, contracts: string[] ): Promise => { - const blockchain = this.blockchainRepository.get(chainId); + const blockchain = this.blockchainScannerRepository.get(chainId); this.logger.info(`[${chainId}] Checking for new contracts ${fromBlock} - ${toBlock}`); // event LogRegistered(address indexed destination, bytes32 name); @@ -261,28 +253,16 @@ export class ContractSynchronizer { .map((contractData) => { this.logger.info(`[${chainId}] saving initial contract ${contractData.name}@${contractData.address}`); - return RegisteredContracts.findOneAndUpdate( - { - _id: ContractSynchronizer.contractInstanceId(chainId, contractData.name, contractData.address), - }, - { - anchor: registryScannerStartingBlock, - address: contractData.address, - chainId: chainId, - }, - { - new: true, - upsert: true, - } + return this.contractRepository.save( + chainId, + registryScannerStartingBlock, + contractData.name, + contractData.address ); }) ); } - private static contractInstanceId(chainId: string, contractName: string, address: string): string { - return `${contractName}::${chainId}::${address}`; - } - private static toLogRegistered(event: Event): LogRegistered { return { destination: event.args[0], diff --git a/src/services/on-chain-stats/BaseTxReceiptFetcher.ts b/src/services/on-chain-stats/BaseTxReceiptFetcher.ts new file mode 100644 index 00000000..9cf60ad3 --- /dev/null +++ b/src/services/on-chain-stats/BaseTxReceiptFetcher.ts @@ -0,0 +1,14 @@ +import * as optimismSDK from '@eth-optimism/sdk'; +import { inject, injectable } from 'inversify'; +import { TransactionReceipt } from '@ethersproject/abstract-provider'; +import { BlockchainScannerRepository } from '../../repositories/BlockchainScannerRepository'; + +@injectable() +export class BaseTxReceiptFetcher { + @inject(BlockchainScannerRepository) private blockchainScannerRepository: BlockchainScannerRepository; + + async call(txHash: string): Promise { + const l2RpcProvider = optimismSDK.asL2Provider(this.blockchainScannerRepository.get('base').provider); // TODO use ChainIds + return l2RpcProvider.getTransactionReceipt(txHash); + } +} diff --git a/src/services/on-chain-stats/DeviationHasherEvm.ts b/src/services/on-chain-stats/DeviationHasherEvm.ts new file mode 100644 index 00000000..c5748177 --- /dev/null +++ b/src/services/on-chain-stats/DeviationHasherEvm.ts @@ -0,0 +1,31 @@ +import { ethers } from 'ethers'; +import { abi } from '../../contracts/UmbrellaFeeds.json'; +import { FeedsPriceData } from '../../types/UpdateInput'; + +export class DeviationHasherEvm { + static apply( + networkId: number, + target: string, + keys: string[], + priceDatas: FeedsPriceData[] + ): { msg: string; hash: string } { + const testimony = ethers.utils.defaultAbiCoder.encode( + ['uint256', 'address', ...this.priceDatasAbi()], + [networkId, target, keys, priceDatas] + ); + + return { hash: ethers.utils.keccak256(testimony), msg: testimony }; + } + + // eslint-disable-next-line @typescript-eslint/no-explicit-any + private static priceDatasAbi(): any { + const submitAbi = abi.find((data: { name?: string }) => data?.name === 'update'); + + if (!submitAbi) throw new Error('missing `update()` in ABI'); + + const { inputs } = submitAbi; + + // [keys, priceDatas] + return [inputs[0], inputs[1]]; + } +} diff --git a/src/services/on-chain-stats/EvmTxsFetcher.ts b/src/services/on-chain-stats/EvmTxsFetcher.ts new file mode 100644 index 00000000..adfe511b --- /dev/null +++ b/src/services/on-chain-stats/EvmTxsFetcher.ts @@ -0,0 +1,72 @@ +import { inject, injectable } from 'inversify'; +import { Logger } from 'winston'; +import { TransactionResponse } from '@ethersproject/providers'; + +import { MappingRepository } from '../../repositories/MappingRepository'; +import { ChainsIds } from '../../types/ChainsIds.js'; +import Settings from '../../types/Settings'; +import { BlockchainScannerRepository } from '../../repositories/BlockchainScannerRepository'; +import { RegisteredContractRepository } from '../../repositories/RegisteredContractRepository'; +import { promiseWithTimeout } from '../../utils/promiseWithTimeout'; + +@injectable() +export class EvmTxsFetcher { + @inject('Settings') private settings!: Settings; + @inject('Logger') private logger!: Logger; + + @inject(BlockchainScannerRepository) private blockchainScannerRepository: BlockchainScannerRepository; + @inject(MappingRepository) private mappingRepository: MappingRepository; + @inject(RegisteredContractRepository) private contractRepository: RegisteredContractRepository; + + async call( + chainId: ChainsIds, + fromBlock: number, + toBlock: number, + existingBlocks: number[] + ): Promise<{ txs: TransactionResponse[]; lastBlockBeforeError: number | undefined }> { + const blockchainScanner = this.blockchainScannerRepository.get(chainId); + const provider = blockchainScanner.provider; + + const arr: number[] = []; + + for (let i = fromBlock; i <= toBlock; i++) { + if (existingBlocks.includes(i)) continue; + + arr.push(i); + } + + this.logger.debug(`[EvmTxsFetcher] fetching txs for ${arr.length} blocks`); + + const allTxsSettled = await Promise.allSettled( + arr.map((i) => { + return promiseWithTimeout(provider.getBlockWithTransactions(i), 15000); + }) + ); + + let errorDetected = false; + let lastBlockBeforeError: number | undefined; + + const allTxs = allTxsSettled.map((result, i) => { + if (result.status == 'fulfilled') { + if (!errorDetected) lastBlockBeforeError = result.value.number; + return result.value; + } + + errorDetected = true; + this.logger.error(`${chainId} block ${arr[i]} error: ${result.reason.toString()}`); + return undefined; + }); + + return { + lastBlockBeforeError: errorDetected ? lastBlockBeforeError : undefined, + txs: allTxs + .filter((txs) => !!txs) + .map((txs) => { + return txs.transactions.map((tx) => { + return { ...tx, timestamp: txs.timestamp }; + }); + }) + .flat(), + }; + } +} diff --git a/src/services/on-chain-stats/GasCalculator.ts b/src/services/on-chain-stats/GasCalculator.ts new file mode 100644 index 00000000..dd5f4d95 --- /dev/null +++ b/src/services/on-chain-stats/GasCalculator.ts @@ -0,0 +1,30 @@ +import { inject, injectable } from 'inversify'; +import { TransactionReceipt } from '@ethersproject/providers'; +import { Logger } from 'winston'; +import { GasCalculatorEvm } from './GasCalculatorEvm'; +import { ChainsIds } from '../../types/ChainsIds'; + +@injectable() +export class GasCalculator { + @inject('Logger') private logger!: Logger; + + @inject(GasCalculatorEvm) private gasCalculatorEvm: GasCalculatorEvm; + + apply(chainId: string, receipt: TransactionReceipt): bigint { + switch (chainId) { + // case CHAIN_IDS.ROOTSTOCK_SBX: + // return rootstockCalculator(receipt); + // case CHAIN_IDS.BASE: + // return baseCalculator(receipt as BaseTransactionReceipt); + // + // case CHAIN_IDS.POLYGON: + // case CHAIN_IDS.LINEA: + case ChainsIds.POLYGON: + case ChainsIds.ARBITRUM: + return this.gasCalculatorEvm.apply(receipt); + + default: + throw new Error(`[GasCalculator] ${chainId} not supported`); + } + } +} diff --git a/src/services/on-chain-stats/GasCalculatorEvm.ts b/src/services/on-chain-stats/GasCalculatorEvm.ts new file mode 100644 index 00000000..73d2c0a5 --- /dev/null +++ b/src/services/on-chain-stats/GasCalculatorEvm.ts @@ -0,0 +1,21 @@ +import { injectable } from 'inversify'; +import { TransactionReceipt } from '@ethersproject/providers'; +import { BigNumber } from 'ethers'; + +@injectable() +export class GasCalculatorEvm { + apply(receipt: TransactionReceipt): bigint { + if (!receipt.gasUsed) { + throw new Error(`Invalid gasUsed for ${receipt.transactionHash}`); + } + + if (!receipt.effectiveGasPrice) { + throw new Error(`Invalid gasPrice for ${receipt.transactionHash}`); + } + + const gasUsed = BigNumber.from(receipt.gasUsed).toBigInt(); + const gasPrice = BigNumber.from(receipt.effectiveGasPrice).toBigInt(); + + return gasUsed * gasPrice; + } +} diff --git a/src/services/on-chain-stats/KeysUpdateService.ts b/src/services/on-chain-stats/KeysUpdateService.ts new file mode 100644 index 00000000..cfd66708 --- /dev/null +++ b/src/services/on-chain-stats/KeysUpdateService.ts @@ -0,0 +1,62 @@ +import { Logger } from 'winston'; +import { inject, injectable } from 'inversify'; +import axios from 'axios'; +import Settings from '../../types/Settings.js'; +import { MappingRepository } from '../../repositories/MappingRepository'; +import { FeedKeyRepository } from '../../repositories/FeedKeyRepository'; + +@injectable() +export class KeysUpdateService { + @inject('Settings') private settings!: Settings; + @inject('Logger') private logger!: Logger; + @inject(MappingRepository) private mappingRepository: MappingRepository; + @inject(FeedKeyRepository) private feedKeyRepository: FeedKeyRepository; + + private readonly SUCCESS_CODES = [200, 201, 301]; + + async apply(): Promise { + const yaml = await this.downloadFile(); + if (!yaml) return; + + const existingKeys = await this.feedKeyRepository.getAllByKey(); + const keys = this.extractKeys(yaml, existingKeys); + + if (keys.length == 0) { + this.logger.debug('[KeysUpdateService] no new keys'); + return; + } + + this.logger.info(`[KeysUpdateService] new keys: ${keys}`); + await Promise.all(keys.map((key) => this.feedKeyRepository.save(key))); + } + + private extractKeys(yaml: string, existingKeys: Record): string[] { + return yaml + .split('\n') + .filter((line) => line.length > 0) + .filter((line) => line[0] != ' ' && line.split(':').length == 2) + .map((line) => line.split(':')[0]) + .filter((key) => !existingKeys[key]); + } + + private async downloadFile(): Promise { + const layer1FeedFile = this.settings.app.layer1FeedFile; + + if (!layer1FeedFile) { + this.logger.warn('[KeysUpdateService] Skipping, no URL configured'); + return; + } + + this.logger.debug(`[KeysUpdateService] layer1FeedFile: ${layer1FeedFile}`); + + const response = await axios.get(layer1FeedFile, { timeout: 3000 }); + + if (!this.SUCCESS_CODES.includes(response.status)) { + this.logger.error(`[KeysUpdateService] Download Failed. HTTP Status: ${response.status}`); + this.logger.error(`[KeysUpdateService] HTTP Response: ${JSON.stringify(response)}`); + return; + } + + return response.data; + } +} diff --git a/src/services/on-chain-stats/OnChainTxFetcher.ts b/src/services/on-chain-stats/OnChainTxFetcher.ts index c7c2dc02..be5ef5cd 100644 --- a/src/services/on-chain-stats/OnChainTxFetcher.ts +++ b/src/services/on-chain-stats/OnChainTxFetcher.ts @@ -1,44 +1,150 @@ import { inject, injectable } from 'inversify'; -import { BlockchainRepository } from '../../repositories/BlockchainRepository'; +import { Logger } from 'winston'; +import { TransactionResponse } from '@ethersproject/providers'; + import { MappingRepository } from '../../repositories/MappingRepository'; import { ChainsIds } from '../../types/ChainsIds.js'; +import Settings from '../../types/Settings'; +import { BlockchainScannerRepository } from '../../repositories/BlockchainScannerRepository'; +import { RegisteredContractRepository } from '../../repositories/RegisteredContractRepository'; +import { UMBRELLA_FEEDS_NAME } from '../../constants/variables'; +import { EvmTxsFetcher } from './EvmTxsFetcher'; +import { UpdateTxRepository } from '../../repositories/UpdateTxRepository'; +import { TxReceiptFetcher } from './TxReceiptFetcher'; +import { CreateBatchRanges } from '../CreateBatchRanges'; @injectable() export class OnChainTxFetcher { - @inject(BlockchainRepository) private blockchainRepository: BlockchainRepository; + @inject('Settings') private settings!: Settings; + @inject('Logger') private logger!: Logger; + + @inject(BlockchainScannerRepository) private blockchainScannerRepository: BlockchainScannerRepository; @inject(MappingRepository) private mappingRepository: MappingRepository; + @inject(RegisteredContractRepository) private contractRepository: RegisteredContractRepository; + @inject(EvmTxsFetcher) private txsFetcher: EvmTxsFetcher; + @inject(UpdateTxRepository) private updateTxRepository: UpdateTxRepository; + @inject(TxReceiptFetcher) private txReceiptFetcher: TxReceiptFetcher; - async call(chainId: ChainsIds, initBlock: number | undefined): Promise { - return; + async call(chainId: ChainsIds, lastSyncedBlock: number): Promise { + this.logger.info(`[OnChainTxFetcher] start for ${chainId} with last synced block ${lastSyncedBlock}`); - if (!initBlock) return; + const blockchainScanner = this.blockchainScannerRepository.get(chainId); - const lastCheckedBlock = await this.mappingRepository.get(this.lastCheckedBlockMappingKey(chainId)); - const currentBlock = await this.blockchainRepository.get(chainId).getBlockNumber(); + if (!blockchainScanner.settings.startBlockNumber) { + this.logger.info(`[OnChainTxFetcher] startBlockNumber not set for ${chainId}`); + return; + } + + const [lastSavedBlock, network] = await Promise.all([ + this.getLastValidCheckedBlock(chainId), + blockchainScanner.provider.getNetwork(), + ]); + + const rangeFrom = this.blockFrom(chainId, lastSavedBlock); + const rangeTo = this.blockTo(chainId, lastSyncedBlock); + + if (rangeFrom >= rangeTo) { + this.logger.debug(`[OnChainTxFetcher] rangeFrom ${rangeFrom} >= rangeTo ${rangeTo}`); + return; + } + + const ranges = CreateBatchRanges.apply(rangeFrom, rangeTo, blockchainScanner.settings.fetchBlocksBatchSize); + const timeStart = Date.now(); + + const feedsMap = await this.umbrellaFeedsMap(chainId); + + this.logger.info( + `[OnChainTxFetcher] blocks on ${chainId} to sync: ${rangeTo - rangeFrom} blocks, starting from ${rangeFrom}` + ); + let gotError = false; + + // sync execution + for (let i = 0; i < ranges.length && this.calcTimeLeft(timeStart) > 0 && !gotError; i++) { + const [from, to] = ranges[i]; + const logPrefix = `[OnChainTxFetcher][${i}/${ranges.length}]`; + this.logger.debug( + `${logPrefix} scanning ${chainId} ${from} - ${to} (${to - from} blocks), T${this.calcTimeLeft(timeStart)}s` + ); + + const fetchedBlocks = await this.updateTxRepository.getBlocks(chainId, from, to); + const { txs, lastBlockBeforeError } = await this.txsFetcher.call(chainId, from, to, fetchedBlocks); + const filteredTx = this.onlyUmbrellaFeedsTx(txs, feedsMap); + + gotError = lastBlockBeforeError !== undefined; + const checkpointBlock = lastBlockBeforeError || to; + + if (gotError) { + this.logger.warn(`${logPrefix} error detected, breaking the loop at ${checkpointBlock}`); + } + + if (filteredTx.length == 0) { + this.logger.debug(`${logPrefix} no 'update()' tx found`); + await this.saveCheckpoint(chainId, checkpointBlock); + continue; + } + + this.logger.info(`${logPrefix} found ${filteredTx.length} 'update()' txs`); - const from = this.blockFrom(lastCheckedBlock, initBlock); - const to = this.blockTo(chainId, from, currentBlock); - if (from >= to) return; + const receipts = await this.txReceiptFetcher.call( + chainId, + filteredTx.map((tx) => tx.hash) + ); - // const { blockId } = await Block.findOne({ status: BlockStatus.Finalized }).sort({ blockId: -1 }); - // const leaves = await Leaf.find({ blockId }); + const allSaved = await Promise.all( + filteredTx.map((tx) => this.updateTxRepository.saveUpdates(chainId, network.chainId, tx, receipts[tx.hash])) + ); + + if (!allSaved.every((success) => success)) { + throw new Error(`${logPrefix} there were errors while saving data to DB`); + } + + await this.saveCheckpoint(chainId, checkpointBlock); + } + } + + private onlyUmbrellaFeedsTx(txs: TransactionResponse[], feedsAddresses: Map): TransactionResponse[] { + return txs.filter((tx) => { + return !!tx.to && feedsAddresses.has(tx.to.toLowerCase()); + }); + } + + private calcTimeLeft(timeStart: number): number { + const maxExecutionTime = (this.settings.jobs.metricsReporting.interval * 3) / 4; + return Math.trunc((maxExecutionTime - (Date.now() - timeStart)) / 1000); + } + + private async umbrellaFeedsMap(chainId: ChainsIds): Promise> { + const map = new Map(); + const umbrellaFeeds = await this.contractRepository.getAllContracts(chainId, UMBRELLA_FEEDS_NAME); + + umbrellaFeeds.forEach((uf) => { + map.set(uf.address.toLowerCase(), true); + }); + + return map; + } + + private blockFrom(chainId: ChainsIds, lastSavedBlock: number | undefined): number { + const blockchainScanner = this.blockchainScannerRepository.get(chainId); + return lastSavedBlock ? lastSavedBlock + 1 : blockchainScanner.settings.startBlockNumber; } private lastCheckedBlockMappingKey(chainId: string): string { return `OnChainTxFetcher_lastCheckedBlock_${chainId}`; } - private blockFrom(lastCheckedBlock: string | undefined, initBlock: number): number { - return Math.max(parseInt(lastCheckedBlock, 10), initBlock); + private async getLastValidCheckedBlock(chainId: ChainsIds): Promise { + const lastCheckedBlock = await this.mappingRepository.get(this.lastCheckedBlockMappingKey(chainId)); + return lastCheckedBlock ? parseInt(lastCheckedBlock, 10) : undefined; } - private blockTo(chainId: ChainsIds, blockFrom: number, currentBlock: number): number { - switch (chainId) { - case ChainsIds.ARBITRUM: - return Math.min(blockFrom + 1000, currentBlock); + private blockTo(chainId: ChainsIds, currentBlock: number): number { + const blockchainScanner = this.blockchainScannerRepository.get(chainId); + return currentBlock - blockchainScanner.settings.confirmations; + } - default: - throw new Error(`[OnChainTxFetcher] now supported chain ${chainId}`); - } + private async saveCheckpoint(chainId: ChainsIds, blockNumber: number): Promise { + this.logger.debug(`[OnChainTxFetcher] checkpoint ${chainId}@${blockNumber}`); + await this.mappingRepository.set(this.lastCheckedBlockMappingKey(chainId), blockNumber.toString(10)); } } diff --git a/src/services/on-chain-stats/SignerRecovery.ts b/src/services/on-chain-stats/SignerRecovery.ts new file mode 100644 index 00000000..ea31a921 --- /dev/null +++ b/src/services/on-chain-stats/SignerRecovery.ts @@ -0,0 +1,13 @@ +import { ethers } from 'ethers'; +import { UpdateData } from '../../types/UpdateInput'; +import { DeviationHasherEvm } from './DeviationHasherEvm'; + +export class SignersRecoveryEvm { + static apply(networkId: number, target: string, txdata: UpdateData): string[] { + const { keys, priceDatas, signatures } = txdata; + const { hash } = DeviationHasherEvm.apply(networkId, target, keys, priceDatas); + + const newDataHash = ethers.utils.hashMessage(Buffer.from(hash.replace('0x', ''), 'hex')); + return signatures.map((s) => ethers.utils.recoverAddress(newDataHash, s)).map((addr) => addr.toLowerCase()); + } +} diff --git a/src/services/on-chain-stats/TxReceiptFetcher.ts b/src/services/on-chain-stats/TxReceiptFetcher.ts new file mode 100644 index 00000000..fe4c1594 --- /dev/null +++ b/src/services/on-chain-stats/TxReceiptFetcher.ts @@ -0,0 +1,27 @@ +import { TransactionReceipt } from '@ethersproject/providers'; +import { inject, injectable } from 'inversify'; + +import { ChainsIds } from '../../types/ChainsIds'; +import { BlockchainScannerRepository } from '../../repositories/BlockchainScannerRepository'; + +@injectable() +export class TxReceiptFetcher { + @inject(BlockchainScannerRepository) private blockchainScannerRepository: BlockchainScannerRepository; + + async call(chainId: ChainsIds, txHashes: string[]): Promise> { + const blockchainScanner = this.blockchainScannerRepository.get(chainId); + const result: Record = {}; + let receipts: TransactionReceipt[] = []; + + switch (chainId) { + // case 'base': + // return await baseTxReceiptFetcher(txHash); + default: + receipts = await Promise.all(txHashes.map((h) => blockchainScanner.provider.getTransactionReceipt(h))); + } + + receipts.forEach((receipt) => (result[receipt.transactionHash] = receipt)); + + return result; + } +} diff --git a/src/types/Settings.ts b/src/types/Settings.ts index 612d4804..7e607dde 100644 --- a/src/types/Settings.ts +++ b/src/types/Settings.ts @@ -1,11 +1,17 @@ -export type BlockchainSettings = { +export interface BlockchainBasic { startBlockNumber: number; - registryScannerStartingBlock?: number; scanBatchSize: number; maxRequestConcurrency: number; confirmations: number; providerUrl: string; contractRegistryAddress: string; +} + +export interface OnChainScannerSettings extends BlockchainBasic { + fetchBlocksBatchSize: number; +} + +export interface BlockchainSettings extends BlockchainBasic { transactions?: { waitForBlockTime: number; minGasPrice: number; @@ -15,7 +21,7 @@ export type BlockchainSettings = { errorLimit: string; }; }; -}; +} export type SinglentonWorkerSchedulerSettings = { interval: number; @@ -50,6 +56,7 @@ type Settings = { blockSyncBatchSize: number; feedsFile: string; feedsOnChain: string; + layer1FeedFile: string; }; blockchain: { contracts: { @@ -65,6 +72,9 @@ type Settings = { chainId: string; replicationConfirmations: number; }; + blockchainScanner: { + arbitrum: OnChainScannerSettings; + }; multiChains: { bsc: BlockchainSettings; ethereum: BlockchainSettings; diff --git a/src/types/UpdateInput.ts b/src/types/UpdateInput.ts new file mode 100644 index 00000000..790b69eb --- /dev/null +++ b/src/types/UpdateInput.ts @@ -0,0 +1,22 @@ +import { BigNumber } from 'ethers'; + +export interface Signature { + v: number; + r: string; + s: string; +} + +export interface FeedsPriceData { + data: string; + heartbeat: number; + timestamp: number; + price: bigint; +} + +export type UpdateInput = [string[], [number, number, number, BigNumber][], [number, string, string][]]; + +export type UpdateData = { + keys: string[]; + priceDatas: FeedsPriceData[]; + signatures: Signature[]; +}; diff --git a/src/utils/promiseWithTimeout.ts b/src/utils/promiseWithTimeout.ts index d7ff506b..b2b96867 100644 --- a/src/utils/promiseWithTimeout.ts +++ b/src/utils/promiseWithTimeout.ts @@ -1,8 +1,8 @@ -export const promiseWithTimeout = (promise: Promise, timeout: number): Promise => { +export const promiseWithTimeout = (promise: Promise, timeoutMs: number): Promise => { const timeoutPromise = new Promise((resolve, reject) => { setTimeout(() => { - reject(new Error(`[promiseWithTimeout] timeout of ${timeout}ms exceeded`)); - }, timeout); + reject(new Error(`[promiseWithTimeout] timeout of ${timeoutMs}ms exceeded`)); + }, timeoutMs); }); return Promise.race([promise, timeoutPromise]); diff --git a/src/workers/MetricsWorker.ts b/src/workers/MetricsWorker.ts index 7b84a65b..fea5af5a 100644 --- a/src/workers/MetricsWorker.ts +++ b/src/workers/MetricsWorker.ts @@ -1,28 +1,43 @@ import Bull from 'bullmq'; -import { Logger } from 'winston'; import { inject, injectable } from 'inversify'; import BasicWorker from './BasicWorker'; import { ContractSynchronizer } from '../services/ContractSynchronizer'; import { ChainsIds } from '../types/ChainsIds'; import { STAKING_BANK_NAME, UMBRELLA_FEEDS_NAME } from '../constants/variables'; +import { OnChainTxFetcher } from '../services/on-chain-stats/OnChainTxFetcher'; +import { KeysUpdateService } from '../services/on-chain-stats/KeysUpdateService'; @injectable() class MetricsWorker extends BasicWorker { - @inject('Logger') logger!: Logger; @inject(ContractSynchronizer) private contractSynchronizer!: ContractSynchronizer; + @inject(OnChainTxFetcher) private onChainTxFetcher!: OnChainTxFetcher; + @inject(KeysUpdateService) private keysUpdateService!: KeysUpdateService; apply = async (job: Bull.Job): Promise => { this.logger.info(`[MetricsWorker] apply for ${job.id}`); - const chains = Object.values(ChainsIds); try { - await Promise.all( - chains.map((chainId) => this.contractSynchronizer.apply(chainId, [UMBRELLA_FEEDS_NAME, STAKING_BANK_NAME])) - ); + await this.keysUpdateService.apply(); } catch (e) { - this.logger.error(e); + this.logger.error(`[MetricsWorker] keysUpdateService: ${e.message}`); } + + try { + const chains = Object.keys(this.settings.blockchain.blockchainScanner) as ChainsIds[]; + await Promise.allSettled(chains.map((chainId) => this.syncOnChainTransactions(chainId))); + } catch (e) { + this.logger.error(`[MetricsWorker] syncOnChainTransactions: ${e.message}`); + } + }; + + private syncOnChainTransactions = async (chainId: ChainsIds): Promise => { + const { lastSyncedBlock } = await this.contractSynchronizer.apply(chainId, [ + UMBRELLA_FEEDS_NAME, + STAKING_BANK_NAME, + ]); + + await this.onChainTxFetcher.call(chainId, lastSyncedBlock); }; } diff --git a/test/services/CreateBatchRanges.test.ts b/test/services/CreateBatchRanges.test.ts new file mode 100644 index 00000000..9a2727a0 --- /dev/null +++ b/test/services/CreateBatchRanges.test.ts @@ -0,0 +1,12 @@ +import { expect } from 'chai'; +import { CreateBatchRanges } from '../../src/services/CreateBatchRanges'; + +describe('CreateBatchRanges', () => { + it('creates ranges', () => { + return expect(CreateBatchRanges.apply(0, 10, 4)).deep.eq([ + [0, 3], + [4, 7], + [8, 10], + ]); + }); +});