From a37cdafc5dc43d4dac3000f2dadeedc8a196127e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joseph-Andr=C3=A9=20Turk?= Date: Sun, 11 Aug 2024 21:05:38 +0200 Subject: [PATCH] feat: mocked mode and coverage --- .gitignore | 4 + .prettierignore | 1 + .solcover.js | 6 +- CustomProvider.ts | 42 +- README.md | 36 +- hardhat.config.ts | 127 +-- launch-fhevm.sh | 11 +- package.json | 16 +- pnpm-lock.yaml | 1383 +++++++++++++++++------ tasks/taskDeploy.ts | 6 +- tasks/taskGatewayRelayer.ts | 28 +- test/asyncDecrypt.ts | 86 +- test/coprocessorUtils.ts | 875 ++++++++++++++ test/fhevmjsMocked.ts | 303 +++++ test/gatewayDecrypt/testAsyncDecrypt.ts | 32 + test/generated.ts | 2 - test/instance.ts | 101 +- test/utils.ts | 31 +- tf.json | 790 +++++++++++++ 19 files changed, 3358 insertions(+), 522 deletions(-) create mode 100644 test/coprocessorUtils.ts create mode 100644 test/fhevmjsMocked.ts delete mode 100644 test/generated.ts create mode 100644 tf.json diff --git a/.gitignore b/.gitignore index da81660..f4324a3 100644 --- a/.gitignore +++ b/.gitignore @@ -10,6 +10,10 @@ dist node_modules types deployments +kms-fhe-keys/ +network-fhe-keys/ +fhevmTemp/ +abi/ # files *.env diff --git a/.prettierignore b/.prettierignore index 68476e1..d1401c9 100644 --- a/.prettierignore +++ b/.prettierignore @@ -19,3 +19,4 @@ coverage.json package-lock.json pnpm-lock.yaml yarn.lock +README.md \ No newline at end of file diff --git a/.solcover.js b/.solcover.js index d71a669..938b911 100644 --- a/.solcover.js +++ b/.solcover.js @@ -3,5 +3,9 @@ module.exports = { providerOptions: { mnemonic: process.env.MNEMONIC, }, - skipFiles: ["test"], + skipFiles: ["test", "fhevmTemp"], + mocha: { + fgrep: "[skip-on-coverage]", + invert: true, + }, }; diff --git a/CustomProvider.ts b/CustomProvider.ts index 1ee7466..f6cdb32 100644 --- a/CustomProvider.ts +++ b/CustomProvider.ts @@ -2,17 +2,55 @@ import { ethers } from "ethers"; import { ProviderWrapper } from "hardhat/plugins"; class CustomProvider extends ProviderWrapper { + public lastBlockSnapshot: number; + public lastCounterRand: number; + public lastBlockSnapshotForDecrypt: number; + constructor(protected readonly _wrappedProvider: any) { super(_wrappedProvider); + this.lastBlockSnapshot = 0; // Initialize the variable + this.lastCounterRand = 0; + this.lastBlockSnapshotForDecrypt = 0; } - public async request(args: { method: string; params?: any[] }): Promise { + async request(args: { method: string; params?: any[] }) { if (args.method === "eth_estimateGas") { const estimatedGasLimit = BigInt(await this._wrappedProvider.request(args)); const increasedGasLimit = ethers.toBeHex((estimatedGasLimit * 120n) / 100n); // override estimated gasLimit by 120%, to avoid some edge case with ethermint gas estimation return increasedGasLimit; } - return this._wrappedProvider.request(args); + if (args.method === "evm_revert") { + const result = await this._wrappedProvider.request(args); + const blockNumberHex = await this._wrappedProvider.request({ method: "eth_blockNumber" }); + this.lastBlockSnapshot = parseInt(blockNumberHex); + this.lastBlockSnapshotForDecrypt = parseInt(blockNumberHex); + + const callData = { + to: "0x000000000000000000000000000000000000005d", + data: "0x1f20d85c", + }; + this.lastCounterRand = await this._wrappedProvider.request({ + method: "eth_call", + params: [callData, "latest"], + }); + return result; + } + if (args.method === "get_lastBlockSnapshot") { + return [this.lastBlockSnapshot, this.lastCounterRand]; + } + if (args.method === "get_lastBlockSnapshotForDecrypt") { + return this.lastBlockSnapshotForDecrypt; + } + if (args.method === "set_lastBlockSnapshot") { + this.lastBlockSnapshot = args.params![0]; + return this.lastBlockSnapshot; + } + if (args.method === "set_lastBlockSnapshotForDecrypt") { + this.lastBlockSnapshotForDecrypt = args.params![0]; + return this.lastBlockSnapshotForDecrypt; + } + const result = this._wrappedProvider.request(args); + return result; } } diff --git a/README.md b/README.md index 625c2c5..23fa720 100644 --- a/README.md +++ b/README.md @@ -71,10 +71,15 @@ Install [docker](https://docs.docker.com/engine/install/) Install [pnpm](https://pnpm.io/installation) Before being able to run any command, you need to create a `.env` file and set a BIP-39 compatible mnemonic as an -environment variable. You can follow the example in `.env.example`. If you don't already have a mnemonic, you can use -this [website](https://iancoleman.io/bip39/) to generate one. +environment variable. You can follow the example in `.env.example` and start with the following command: -Then, proceed with installing dependencies - please make sure to use Node v20 or more recent or this will fail: +```sh +cp .env.example .env +``` + +If you don't already have a mnemonic, you can use this [website](https://iancoleman.io/bip39/) to generate one. + +Then, proceed with installing dependencies - please **_make sure to use Node v20_** or more recent or this will fail: ```sh pnpm install @@ -195,14 +200,27 @@ pnpm clean ### Mocked mode -**Warning** Since upgrading fhevm to v0.5 the previous version of mocked mode is no longer functional. We are now -working on a new version of the mocked mode which is more faithful to the real fhevm, with (almost) full parity to fhevm -functionalities. This is now possible since fhevm v0.5 introduced an explicit ACL contract. New mocked feature will be -delivered very soon. - The mocked mode allows faster testing and the ability to analyze coverage of the tests. In this mocked version, encrypted types are not really encrypted, and the tests are run on the original version of the EVM, on a local hardhat -network instance. +network instance. To run the tests in mocked mode, you can use directly the following command: + +```bash +pnpm test:mock +``` + +To analyze the coverage of the tests (in mocked mode necessarily, as this cannot be done on the real fhEVM node), you +can use this command : + +```bash +pnpm coverage:mock +``` + +Then open the file `coverage/index.html`. You can see there which line or branch for each contract which has been +covered or missed by your test suite. This allows increased security by pointing out missing branches not covered yet by +the current tests. + +> [!Note] +> Due to intrinsic limitations of the original EVM, the mocked version differ in few corner cases from the real fhEVM, the main difference is the difference in gas prices for the FHE operations. This means that before deploying to production, developers still need to run the tests with the original fhEVM node, as a final check in non-mocked mode, with `pnpm test`. ### Syntax Highlighting diff --git a/hardhat.config.ts b/hardhat.config.ts index 6093c52..85a5c4b 100644 --- a/hardhat.config.ts +++ b/hardhat.config.ts @@ -1,10 +1,8 @@ import "@nomicfoundation/hardhat-toolbox"; import dotenv from "dotenv"; -import * as fs from "fs"; +import * as fs from "fs-extra"; import "hardhat-deploy"; import "hardhat-ignore-warnings"; -import "hardhat-preprocessor"; -import { TASK_PREPROCESS } from "hardhat-preprocessor"; import type { HardhatUserConfig, extendProvider } from "hardhat/config"; import { task } from "hardhat/config"; import type { NetworkUserConfig } from "hardhat/types"; @@ -12,8 +10,8 @@ import { resolve } from "path"; import * as path from "path"; import CustomProvider from "./CustomProvider"; +// Adjust the import path as needed import "./tasks/accounts"; -import "./tasks/deployERC20"; import "./tasks/getEthereumAddress"; import "./tasks/taskDeploy"; import "./tasks/taskGatewayRelayer"; @@ -24,18 +22,6 @@ extendProvider(async (provider, config, network) => { return newProvider; }); -function getAllSolidityFiles(dir: string, fileList: string[] = []): string[] { - fs.readdirSync(dir).forEach((file) => { - const filePath = path.join(dir, file); - if (fs.statSync(filePath).isDirectory()) { - getAllSolidityFiles(filePath, fileList); - } else if (filePath.endsWith(".sol")) { - fileList.push(filePath); - } - }); - return fileList; -} - task("compile:specific", "Compiles only the specified contract") .addParam("contract", "The contract's path") .setAction(async ({ contract }, hre) => { @@ -45,43 +31,15 @@ task("compile:specific", "Compiles only the specified contract") await hre.run("compile"); }); -task("coverage-mock", "Run coverage after running pre-process task").setAction(async function (args, env) { - const contractsPath = path.join(env.config.paths.root, "contracts/"); - const solidityFiles = getAllSolidityFiles(contractsPath); - const originalContents: Record = {}; - solidityFiles.forEach((filePath) => { - originalContents[filePath] = fs.readFileSync(filePath, { encoding: "utf8" }); - }); - - try { - await env.run(TASK_PREPROCESS); - await env.run("coverage"); - } finally { - // Restore original files - for (const filePath in originalContents) { - fs.writeFileSync(filePath, originalContents[filePath], { encoding: "utf8" }); - } - } -}); - const dotenvConfigPath: string = process.env.DOTENV_CONFIG_PATH || "./.env"; dotenv.config({ path: resolve(__dirname, dotenvConfigPath) }); +// Ensure that we have all the environment variables we need. const mnemonic: string | undefined = process.env.MNEMONIC; if (!mnemonic) { throw new Error("Please set your MNEMONIC in a .env file"); } -const network = process.env.HARDHAT_NETWORK; - -function getRemappings() { - return fs - .readFileSync("remappings.txt", "utf8") - .split("\n") - .filter(Boolean) // remove empty lines - .map((line: string) => line.trim().split("=")); -} - const chainIds = { zama: 8009, local: 9000, @@ -116,59 +74,50 @@ function getChainConfig(chain: keyof typeof chainIds): NetworkUserConfig { }; } +task("coverage").setAction(async (taskArgs, hre, runSuper) => { + hre.config.networks.hardhat.allowUnlimitedContractSize = true; + hre.config.networks.hardhat.blockGasLimit = 1099511627775; + await runSuper(taskArgs); +}); + task("test", async (taskArgs, hre, runSuper) => { // Run modified test task - - if (network === "hardhat") { + if (hre.network.name === "hardhat") { // in fhevm mode all this block is done when launching the node via `pnmp fhevm:start` - const privKeyDeployer = process.env.PRIVATE_KEY_ORACLE_DEPLOYER; - const privKeyOwner = process.env.PRIVATE_KEY_ORACLE_OWNER; - const privKeyRelayer = process.env.PRIVATE_KEY_ORACLE_RELAYER; - const deployerAddress = new hre.ethers.Wallet(privKeyDeployer!).address; - const ownerAddress = new hre.ethers.Wallet(privKeyOwner!).address; - const relayerAddress = new hre.ethers.Wallet(privKeyRelayer!).address; - + await hre.run("clean"); + await hre.run("compile:specific", { contract: "contracts" }); + const sourceDir = path.resolve(__dirname, "node_modules/fhevm/"); + const destinationDir = path.resolve(__dirname, "fhevmTemp/"); + fs.copySync(sourceDir, destinationDir, { dereference: true }); + await hre.run("compile:specific", { contract: "fhevmTemp/lib" }); + await hre.run("compile:specific", { contract: "fhevmTemp/gateway" }); + const abiDir = path.resolve(__dirname, "abi"); + fs.ensureDirSync(abiDir); + const sourceFile = path.resolve(__dirname, "artifacts/fhevmTemp/lib/TFHEExecutor.sol/TFHEExecutor.json"); + const destinationFile = path.resolve(abiDir, "TFHEExecutor.json"); + fs.copyFileSync(sourceFile, destinationFile); + + const targetAddress = "0x000000000000000000000000000000000000005d"; + const NeverRevert = await hre.artifacts.readArtifact("MockedPrecompile"); + const bytecode = NeverRevert.deployedBytecode; + await hre.network.provider.send("hardhat_setCode", [targetAddress, bytecode]); + console.log(`Code of Mocked Pre-compile set at address: ${targetAddress}`); + fs.removeSync("fhevmTemp/"); + + const privKeyDeployer = process.env.PRIVATE_KEY_GATEWAY_DEPLOYER; await hre.run("task:computePredeployAddress", { privateKey: privKeyDeployer }); - - const bal = "0x1000000000000000000000000000000000000000"; - const p1 = hre.network.provider.send("hardhat_setBalance", [deployerAddress, bal]); - const p2 = hre.network.provider.send("hardhat_setBalance", [ownerAddress, bal]); - const p3 = hre.network.provider.send("hardhat_setBalance", [relayerAddress, bal]); - await Promise.all([p1, p2, p3]); - await hre.run("compile"); - await hre.run("task:deployOracle", { privateKey: privKeyDeployer, ownerAddress: ownerAddress }); - - const parsedEnv = dotenv.parse(fs.readFileSync("node_modules/fhevm/oracle/.env.oracle")); - const oraclePredeployAddress = parsedEnv.ORACLE_CONTRACT_PREDEPLOY_ADDRESS; - - await hre.run("task:addRelayer", { - privateKey: privKeyOwner, - oracleAddress: oraclePredeployAddress, - relayerAddress: relayerAddress, - }); + await hre.run("task:computeACLAddress"); + await hre.run("task:computeTFHEExecutorAddress"); + await hre.run("task:computeKMSVerifierAddress"); + await hre.run("task:deployACL"); + await hre.run("task:deployTFHEExecutor"); + await hre.run("task:deployKMSVerifier"); + await hre.run("task:launchFhevm", { skipGetCoin: false }); } - await runSuper(); }); const config: HardhatUserConfig = { - preprocess: { - eachLine: () => ({ - transform: (line: string) => { - if (network === "hardhat") { - if (line.match(/".*.sol";$/)) { - for (const [from, to] of getRemappings()) { - if (line.includes(from)) { - line = line.replace(from, to); - break; - } - } - } - } - return line; - }, - }), - }, defaultNetwork: "local", namedAccounts: { deployer: 0, diff --git a/launch-fhevm.sh b/launch-fhevm.sh index 576333f..63c0e2d 100755 --- a/launch-fhevm.sh +++ b/launch-fhevm.sh @@ -4,15 +4,18 @@ # 1. A local and **fresh** fhEVM node is already running. # 2. All test addresses are funded (e.g. via the fund_test_addresses.sh script). npx hardhat clean -mkdir fhevmTemp +mkdir -p fhevmTemp cp -L -r node_modules/fhevm fhevmTemp/ npx hardhat compile:specific --contract fhevmTemp/fhevm/lib npx hardhat compile:specific --contract fhevmTemp/fhevm/gateway -rm -rf fhevmTemp +mkdir -p abi +cp artifacts/fhevmTemp/fhevm/lib/TFHEExecutor.sol/TFHEExecutor.json abi/TFHEExecutor.json PRIVATE_KEY_GATEWAY_DEPLOYER=$(grep PRIVATE_KEY_GATEWAY_DEPLOYER .env | cut -d '"' -f 2) npx hardhat task:computePredeployAddress --private-key "$PRIVATE_KEY_GATEWAY_DEPLOYER" +npx hardhat compile:specific --contract contracts + npx hardhat task:computeACLAddress npx hardhat task:computeTFHEExecutorAddress npx hardhat task:computeKMSVerifierAddress @@ -20,4 +23,6 @@ npx hardhat task:deployACL npx hardhat task:deployTFHEExecutor npx hardhat task:deployKMSVerifier -npx hardhat task:launchFhevm --skip-get-coin true +rm -rf fhevmTemp + +npx hardhat task:launchFhevm --skip-get-coin true \ No newline at end of file diff --git a/package.json b/package.json index fb24b26..3bd6c43 100644 --- a/package.json +++ b/package.json @@ -31,12 +31,13 @@ "eslint": "^8.28.0", "eslint-config-prettier": "^8.5.0", "ethers": "^6.8.0", - "fhevm": "^0.5.3", + "fhevm": "^0.5.5", "fhevmjs": "^0.5.2", "fs-extra": "^10.1.0", - "hardhat": "^2.19.4", + "hardhat": "^2.22.8", "hardhat-deploy": "^0.11.29", "hardhat-gas-reporter": "^1.0.9", + "hardhat-ignore-warnings": "^0.2.11", "hardhat-preprocessor": "^0.1.5", "lodash": "^4.17.21", "mocha": "^10.1.0", @@ -45,7 +46,7 @@ "rimraf": "^4.1.2", "solhint": "^3.4.0", "solhint-plugin-prettier": "^0.0.5", - "solidity-coverage": "0.8.6", + "solidity-coverage": "0.8.12", "ts-generator": "^0.1.1", "ts-node": "^10.9.1", "typechain": "^8.2.0", @@ -81,8 +82,8 @@ "prettier:write": "prettier --write \"**/*.{js,json,md,sol,ts,yml}\"", "typechain": "cross-env TS_NODE_TRANSPILE_ONLY=true hardhat typechain", "test": "hardhat test", - "test:mock": "HARDHAT_NETWORK=hardhat hardhat test --network hardhat", - "coverage:mock": "HARDHAT_NETWORK=hardhat hardhat coverage-mock --network hardhat", + "test:mock": "hardhat test --network hardhat", + "coverage:mock": "hardhat coverage", "task:getEthereumAddress": "hardhat task:getEthereumAddress", "task:deployERC20": "hardhat task:deployERC20", "task:accounts": "hardhat task:accounts", @@ -97,6 +98,7 @@ "fhevm:faucet:eve": "docker exec -i zama-dev-fhevm-validator-1 faucet $(npx hardhat task:getEthereumAddressEve)" }, "dependencies": { - "hardhat-ignore-warnings": "^0.2.11" + "extra-bigint": "^1.1.18", + "sqlite3": "^5.1.7" } -} \ No newline at end of file +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 5cab201..e6302a6 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -8,25 +8,28 @@ importers: .: dependencies: - hardhat-ignore-warnings: - specifier: ^0.2.11 - version: 0.2.11 + extra-bigint: + specifier: ^1.1.18 + version: 1.1.18 + sqlite3: + specifier: ^5.1.7 + version: 5.1.7 devDependencies: '@nomicfoundation/hardhat-chai-matchers': specifier: ^2.0.0 - version: 2.0.7(@nomicfoundation/hardhat-ethers@3.0.6(ethers@6.13.1)(hardhat@2.22.6(ts-node@10.9.2(@types/node@18.19.39)(typescript@5.5.3))(typescript@5.5.3)))(chai@4.4.1)(ethers@6.13.1)(hardhat@2.22.6(ts-node@10.9.2(@types/node@18.19.39)(typescript@5.5.3))(typescript@5.5.3)) + version: 2.0.7(@nomicfoundation/hardhat-ethers@3.0.6(ethers@6.13.2)(hardhat@2.22.8(ts-node@10.9.2(@types/node@18.19.44)(typescript@5.5.4))(typescript@5.5.4)))(chai@4.5.0)(ethers@6.13.2)(hardhat@2.22.8(ts-node@10.9.2(@types/node@18.19.44)(typescript@5.5.4))(typescript@5.5.4)) '@nomicfoundation/hardhat-ethers': specifier: ^3.0.0 - version: 3.0.6(ethers@6.13.1)(hardhat@2.22.6(ts-node@10.9.2(@types/node@18.19.39)(typescript@5.5.3))(typescript@5.5.3)) + version: 3.0.6(ethers@6.13.2)(hardhat@2.22.8(ts-node@10.9.2(@types/node@18.19.44)(typescript@5.5.4))(typescript@5.5.4)) '@nomicfoundation/hardhat-network-helpers': specifier: ^1.0.6 - version: 1.0.11(hardhat@2.22.6(ts-node@10.9.2(@types/node@18.19.39)(typescript@5.5.3))(typescript@5.5.3)) + version: 1.0.11(hardhat@2.22.8(ts-node@10.9.2(@types/node@18.19.44)(typescript@5.5.4))(typescript@5.5.4)) '@nomicfoundation/hardhat-toolbox': specifier: ^3.0.0 - version: 3.0.0(lbpcol4eomcrshoanzytc66lfi) + version: 3.0.0(geae4jvdfg2eknoy6ku3h4qpgy) '@nomicfoundation/hardhat-verify': specifier: ^1.0.0 - version: 1.1.1(hardhat@2.22.6(ts-node@10.9.2(@types/node@18.19.39)(typescript@5.5.3))(typescript@5.5.3)) + version: 1.1.1(hardhat@2.22.8(ts-node@10.9.2(@types/node@18.19.44)(typescript@5.5.4))(typescript@5.5.4)) '@openzeppelin/contracts': specifier: ^5.0.2 version: 5.0.2 @@ -35,13 +38,13 @@ importers: version: 4.3.0(prettier@2.8.8) '@typechain/ethers-v6': specifier: ^0.4.0 - version: 0.4.3(ethers@6.13.1)(typechain@8.3.2(typescript@5.5.3))(typescript@5.5.3) + version: 0.4.3(ethers@6.13.2)(typechain@8.3.2(typescript@5.5.4))(typescript@5.5.4) '@typechain/hardhat': specifier: ^8.0.0 - version: 8.0.3(@typechain/ethers-v6@0.4.3(ethers@6.13.1)(typechain@8.3.2(typescript@5.5.3))(typescript@5.5.3))(ethers@6.13.1)(hardhat@2.22.6(ts-node@10.9.2(@types/node@18.19.39)(typescript@5.5.3))(typescript@5.5.3))(typechain@8.3.2(typescript@5.5.3)) + version: 8.0.3(@typechain/ethers-v6@0.4.3(ethers@6.13.2)(typechain@8.3.2(typescript@5.5.4))(typescript@5.5.4))(ethers@6.13.2)(hardhat@2.22.8(ts-node@10.9.2(@types/node@18.19.44)(typescript@5.5.4))(typescript@5.5.4))(typechain@8.3.2(typescript@5.5.4)) '@types/chai': specifier: ^4.3.4 - version: 4.3.16 + version: 4.3.17 '@types/fs-extra': specifier: ^9.0.13 version: 9.0.13 @@ -50,16 +53,16 @@ importers: version: 10.0.7 '@types/node': specifier: ^18.11.9 - version: 18.19.39 + version: 18.19.44 '@typescript-eslint/eslint-plugin': specifier: ^5.44.0 - version: 5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.5.3))(eslint@8.57.0)(typescript@5.5.3) + version: 5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.5.4))(eslint@8.57.0)(typescript@5.5.4) '@typescript-eslint/parser': specifier: ^5.44.0 - version: 5.62.0(eslint@8.57.0)(typescript@5.5.3) + version: 5.62.0(eslint@8.57.0)(typescript@5.5.4) chai: specifier: ^4.3.7 - version: 4.4.1 + version: 4.5.0 cross-env: specifier: ^7.0.3 version: 7.0.3 @@ -74,34 +77,37 @@ importers: version: 8.10.0(eslint@8.57.0) ethers: specifier: ^6.8.0 - version: 6.13.1 + version: 6.13.2 fhevm: - specifier: ^0.5.3 - version: 0.5.3 + specifier: ^0.5.5 + version: 0.5.5 fhevmjs: specifier: ^0.5.2 - version: 0.5.2 + version: 0.5.2(encoding@0.1.13) fs-extra: specifier: ^10.1.0 version: 10.1.0 hardhat: - specifier: ^2.19.4 - version: 2.22.6(ts-node@10.9.2(@types/node@18.19.39)(typescript@5.5.3))(typescript@5.5.3) + specifier: ^2.22.8 + version: 2.22.8(ts-node@10.9.2(@types/node@18.19.44)(typescript@5.5.4))(typescript@5.5.4) hardhat-deploy: specifier: ^0.11.29 version: 0.11.45 hardhat-gas-reporter: specifier: ^1.0.9 - version: 1.0.10(hardhat@2.22.6(ts-node@10.9.2(@types/node@18.19.39)(typescript@5.5.3))(typescript@5.5.3)) + version: 1.0.10(hardhat@2.22.8(ts-node@10.9.2(@types/node@18.19.44)(typescript@5.5.4))(typescript@5.5.4)) + hardhat-ignore-warnings: + specifier: ^0.2.11 + version: 0.2.11 hardhat-preprocessor: specifier: ^0.1.5 - version: 0.1.5(hardhat@2.22.6(ts-node@10.9.2(@types/node@18.19.39)(typescript@5.5.3))(typescript@5.5.3)) + version: 0.1.5(hardhat@2.22.8(ts-node@10.9.2(@types/node@18.19.44)(typescript@5.5.4))(typescript@5.5.4)) lodash: specifier: ^4.17.21 version: 4.17.21 mocha: specifier: ^10.1.0 - version: 10.6.0 + version: 10.7.3 prettier: specifier: ^2.8.4 version: 2.8.8 @@ -113,25 +119,25 @@ importers: version: 4.4.1 solhint: specifier: ^3.4.0 - version: 3.6.2(typescript@5.5.3) + version: 3.6.2(typescript@5.5.4) solhint-plugin-prettier: specifier: ^0.0.5 version: 0.0.5(prettier-plugin-solidity@1.3.1(prettier@2.8.8))(prettier@2.8.8) solidity-coverage: - specifier: 0.8.6 - version: 0.8.6(hardhat@2.22.6(ts-node@10.9.2(@types/node@18.19.39)(typescript@5.5.3))(typescript@5.5.3)) + specifier: 0.8.12 + version: 0.8.12(hardhat@2.22.8(ts-node@10.9.2(@types/node@18.19.44)(typescript@5.5.4))(typescript@5.5.4)) ts-generator: specifier: ^0.1.1 version: 0.1.1 ts-node: specifier: ^10.9.1 - version: 10.9.2(@types/node@18.19.39)(typescript@5.5.3) + version: 10.9.2(@types/node@18.19.44)(typescript@5.5.4) typechain: specifier: ^8.2.0 - version: 8.3.2(typescript@5.5.3) + version: 8.3.2(typescript@5.5.4) typescript: specifier: ^5.1.6 - version: 5.5.3 + version: 5.5.4 packages: @@ -146,8 +152,8 @@ packages: resolution: {integrity: sha512-oLcVCTeIFadUoArDTwpluncplrYBmTCCZZgXCbgNGvOBBiSDDK3eWO4b/+eOTli5tKv1lg+a5/NAXg+nTcei1w==} engines: {node: '>=6.9.0'} - '@babel/generator@7.24.7': - resolution: {integrity: sha512-oipXieGC3i45Y1A41t4tAqpnEZWgB/lC6Ehh6+rOviR5XWpTtMmLN+fGjz9vOiNRt0p6RtO6DtD0pdU3vpqdSA==} + '@babel/generator@7.25.0': + resolution: {integrity: sha512-3LEEcj3PVW8pW2R1SR1M89g/qrYk/m/mB/tLqn7dn4sbBUQyTqnlod+II2U4dqiGtUmkcnAmkMDralTFZttRiw==} engines: {node: '>=6.9.0'} '@babel/helper-environment-visitor@7.24.7': @@ -166,8 +172,8 @@ packages: resolution: {integrity: sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==} engines: {node: '>=6.9.0'} - '@babel/helper-string-parser@7.24.7': - resolution: {integrity: sha512-7MbVt6xrwFQbunH2DNQsAP5sTGxfqQtErvBIvIMi6EQnbgUOuVYanvREcmFrOPhoXBrTtjhhP+lW+o5UfK+tDg==} + '@babel/helper-string-parser@7.24.8': + resolution: {integrity: sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==} engines: {node: '>=6.9.0'} '@babel/helper-validator-identifier@7.24.7': @@ -178,13 +184,13 @@ packages: resolution: {integrity: sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==} engines: {node: '>=6.9.0'} - '@babel/parser@7.24.7': - resolution: {integrity: sha512-9uUYRm6OqQrCqQdG1iCBwBPZgN8ciDBro2nIOFaiRz1/BCxaI7CNvQbDHvsArAC7Tw9Hda/B3U+6ui9u4HWXPw==} + '@babel/parser@7.25.3': + resolution: {integrity: sha512-iLTJKDbJ4hMvFPgQwwsVoxtHyWpKKPBrxkANrSYewDPaPpT5py5yeVkgPIJ7XYXhndxJpaA3PyALSXQ7u8e/Dw==} engines: {node: '>=6.0.0'} hasBin: true - '@babel/template@7.24.7': - resolution: {integrity: sha512-jYqfPrU9JTF0PmPy1tLYHW4Mp4KlgxJD9l2nP9fD6yT/ICi554DmrWBAEYpIelzjHf1msDP3PxJIRt/nFNfBig==} + '@babel/template@7.25.0': + resolution: {integrity: sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q==} engines: {node: '>=6.9.0'} '@babel/traverse@7.23.2': @@ -195,8 +201,8 @@ packages: resolution: {integrity: sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==} engines: {node: '>=6.9.0'} - '@babel/types@7.24.7': - resolution: {integrity: sha512-XEFXSlxiG5td2EJRe8vOmRbaXVgfcBlszKujvVmWIK/UpywWljQCfzAv3RQCGujWQ1RD4YYWEAqDXfuJiy8f5Q==} + '@babel/types@7.25.2': + resolution: {integrity: sha512-YTnYtra7W9e6/oAZEHj0bJehPRUlLH9/fbpT5LfB0NhQXyALCRkRs3zH9v07IYhkgpqX6Z78FnuccZr/l4Fs4Q==} engines: {node: '>=6.9.0'} '@cspotcode/source-map-support@0.8.1': @@ -324,6 +330,9 @@ packages: resolution: {integrity: sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==} engines: {node: '>=14'} + '@gar/promisify@1.1.3': + resolution: {integrity: sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==} + '@humanwhocodes/config-array@0.11.14': resolution: {integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==} engines: {node: '>=10.10.0'} @@ -349,8 +358,8 @@ packages: resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} engines: {node: '>=6.0.0'} - '@jridgewell/sourcemap-codec@1.4.15': - resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} + '@jridgewell/sourcemap-codec@1.5.0': + resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} '@jridgewell/trace-mapping@0.3.25': resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} @@ -394,36 +403,36 @@ packages: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} - '@nomicfoundation/edr-darwin-arm64@0.4.1': - resolution: {integrity: sha512-XuiUUnWAVNw7JYv7nRqDWfpBm21HOxCRBQ8lQnRnmiets9Ss2X5Ul9mvBheIPh/D0wBzwJ8TRtsSrorpwE79cA==} + '@nomicfoundation/edr-darwin-arm64@0.5.2': + resolution: {integrity: sha512-Gm4wOPKhbDjGTIRyFA2QUAPfCXA1AHxYOKt3yLSGJkQkdy9a5WW+qtqKeEKHc/+4wpJSLtsGQfpzyIzggFfo/A==} engines: {node: '>= 18'} - '@nomicfoundation/edr-darwin-x64@0.4.1': - resolution: {integrity: sha512-N1MfJqEX5ixaXlyyrHnaYxzwIT27Nc/jUgLI7ts4/9kRvPTvyZRYmXS1ciKhmUFr/WvFckTCix2RJbZoGGtX7g==} + '@nomicfoundation/edr-darwin-x64@0.5.2': + resolution: {integrity: sha512-ClyABq2dFCsrYEED3/UIO0c7p4H1/4vvlswFlqUyBpOkJccr75qIYvahOSJRM62WgUFRhbSS0OJXFRwc/PwmVg==} engines: {node: '>= 18'} - '@nomicfoundation/edr-linux-arm64-gnu@0.4.1': - resolution: {integrity: sha512-bSPOfmcFjJwDgWOV5kgZHeqg2OWu1cINrHSGjig0aVHehjcoX4Sgayrj6fyAxcOV5NQKA6WcyTFll6NrCxzWRA==} + '@nomicfoundation/edr-linux-arm64-gnu@0.5.2': + resolution: {integrity: sha512-HWMTVk1iOabfvU2RvrKLDgtFjJZTC42CpHiw2h6rfpsgRqMahvIlx2jdjWYzFNy1jZKPTN1AStQ/91MRrg5KnA==} engines: {node: '>= 18'} - '@nomicfoundation/edr-linux-arm64-musl@0.4.1': - resolution: {integrity: sha512-F/+DgOdeBFQDrk+SX4aFffJFBgJfd75ZtE2mjcWNAh/qWiS7NfUxdQX/5OvNo/H6EY4a+3bZH6Bgzqg4mEWvMw==} + '@nomicfoundation/edr-linux-arm64-musl@0.5.2': + resolution: {integrity: sha512-CwsQ10xFx/QAD5y3/g5alm9+jFVuhc7uYMhrZAu9UVF+KtVjeCvafj0PaVsZ8qyijjqVuVsJ8hD1x5ob7SMcGg==} engines: {node: '>= 18'} - '@nomicfoundation/edr-linux-x64-gnu@0.4.1': - resolution: {integrity: sha512-POHhTWczIXCPhzKtY0Vt/l+VCqqCx5gNR5ErwSrNnLz/arfQobZFAU+nc61BX3Jch82TW8b3AbfGI73Kh7gO0w==} + '@nomicfoundation/edr-linux-x64-gnu@0.5.2': + resolution: {integrity: sha512-CWVCEdhWJ3fmUpzWHCRnC0/VLBDbqtqTGTR6yyY1Ep3S3BOrHEAvt7h5gx85r2vLcztisu2vlDq51auie4IU1A==} engines: {node: '>= 18'} - '@nomicfoundation/edr-linux-x64-musl@0.4.1': - resolution: {integrity: sha512-uu8oNp4Ozg3H1x1We0FF+rwXfFiAvsOm5GQ+OBx9YYOXnfDPWqguQfGIkhrti9GD0iYhfQ/WOG5wvp0IzzgGSg==} + '@nomicfoundation/edr-linux-x64-musl@0.5.2': + resolution: {integrity: sha512-+aJDfwhkddy2pP5u1ISg3IZVAm0dO836tRlDTFWtvvSMQ5hRGqPcWwlsbobhDQsIxhPJyT7phL0orCg5W3WMeA==} engines: {node: '>= 18'} - '@nomicfoundation/edr-win32-x64-msvc@0.4.1': - resolution: {integrity: sha512-PaZHFw455z89ZiKYNTnKu+/TiVZVRI+mRJsbRTe2N0VlYfUBS1o2gdXBM12oP1t198HR7xQwEPPAslTFxGBqHA==} + '@nomicfoundation/edr-win32-x64-msvc@0.5.2': + resolution: {integrity: sha512-CcvvuA3sAv7liFNPsIR/68YlH6rrybKzYttLlMr80d4GKJjwJ5OKb3YgE6FdZZnOfP19HEHhsLcE0DPLtY3r0w==} engines: {node: '>= 18'} - '@nomicfoundation/edr@0.4.1': - resolution: {integrity: sha512-NgrMo2rI9r28uidumvd+K2/AJLdxtXsUlJr3hj/pM6S1FCd/HiWaLeLa/cjCVPcE2u1rYAa3W6UFxLCB7S5Dhw==} + '@nomicfoundation/edr@0.5.2': + resolution: {integrity: sha512-hW/iLvUQZNTVjFyX/I40rtKvvDOqUEyIi96T28YaLfmPL+3LW2lxmYLUXEJ6MI14HzqxDqrLyhf6IbjAa2r3Dw==} engines: {node: '>= 18'} '@nomicfoundation/ethereumjs-common@4.0.4': @@ -529,6 +538,14 @@ packages: resolution: {integrity: sha512-q4n32/FNKIhQ3zQGGw5CvPF6GTvDCpYwIf7bEY/dZTZbgfDsHyjJwURxUJf3VQuuJj+fDIFl4+KkBVbw4Ef6jA==} engines: {node: '>= 12'} + '@npmcli/fs@1.1.1': + resolution: {integrity: sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ==} + + '@npmcli/move-file@1.1.2': + resolution: {integrity: sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==} + engines: {node: '>=10'} + deprecated: This functionality has been moved to @npmcli/fs + '@openzeppelin/contracts@5.0.2': resolution: {integrity: sha512-ytPc6eLGcHHnapAZ9S+5qsdomhjo6QBHTDRRBFfTxXIpsicMhVPouPgmUPebZZZGX7vt9USA+Z+0M0dSVtSUEA==} @@ -587,6 +604,10 @@ packages: '@solidity-parser/parser@0.18.0': resolution: {integrity: sha512-yfORGUIPgLck41qyN7nbwJRAx17/jAIXCTanHOJZhB6PJ1iAk/84b/xlsVKFSyNyLXIj0dhppoE0+CRws7wlzA==} + '@tootallnate/once@1.1.2': + resolution: {integrity: sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==} + engines: {node: '>= 6'} + '@trivago/prettier-plugin-sort-imports@4.3.0': resolution: {integrity: sha512-r3n0onD3BTOVUNPhR4lhVK4/pABGpbA7bW3eumZnYdKaHkf1qEC+Mag6DPbGNuuh0eG8AaYj+YqmVHSiGslaTQ==} peerDependencies: @@ -632,8 +653,8 @@ packages: '@types/chai-as-promised@7.1.8': resolution: {integrity: sha512-ThlRVIJhr69FLlh6IctTXFkmhtP3NpMZ2QGq69StYLyKZFp/HOp1VdKZj7RvfNWYYcJ1xlbLGLLWj1UvP5u/Gw==} - '@types/chai@4.3.16': - resolution: {integrity: sha512-PatH4iOdyh3MyWtmHVFXLWCCIhUbopaltqddG9BzB+gMIzee2MJrvd+jouii9Z3wzQJruGWAm7WOMjgfG8hQlQ==} + '@types/chai@4.3.17': + resolution: {integrity: sha512-zmZ21EWzR71B4Sscphjief5djsLre50M6lI622OSySTmn9DB3j+C3kWroHfBQWXbOBwbgg/M8CG/hUxDLIloow==} '@types/concat-stream@1.6.1': resolution: {integrity: sha512-eHE4cQPoj6ngxBZMvVf6Hw7Mh4jMW4U9lpGmS5GBPB9RYxlFg+CHaVN7ErNY4W9XfLIEn20b4VDYaIrbq0q4uA==} @@ -671,8 +692,8 @@ packages: '@types/node@18.15.13': resolution: {integrity: sha512-N+0kuo9KgrUQ1Sn/ifDXsvg0TTleP7rIy4zOBGECxAljqvqfqpTfzx0Q1NUedOixRMBfe2Whhb056a42cWs26Q==} - '@types/node@18.19.39': - resolution: {integrity: sha512-nPwTRDKUctxw3di5b4TfT3I0sWDiWoPQCZjXhvdkINntwr8lcoVCKsTgnXeRubKIlfnV+eN/HYk6Jb40tbcEAQ==} + '@types/node@18.19.44': + resolution: {integrity: sha512-ZsbGerYg72WMXUIE9fYxtvfzLEuq6q8mKERdWFnqTmOvudMxnz+CBNRoOwJ2kNpFOncrKjT1hZwxjlFgQ9qvQA==} '@types/node@8.10.66': resolution: {integrity: sha512-tktOkFUA4kXx2hhhrB8bIFb5TbwzS4uOhKEmwiD+NoiL0qtP2OQ9mFldbgD4dV1djrlBYP6eBuQZiWjuHUpqFw==} @@ -773,10 +794,6 @@ packages: engines: {node: '>=0.4.0'} hasBin: true - address@1.2.2: - resolution: {integrity: sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA==} - engines: {node: '>= 10.0.0'} - adm-zip@0.4.16: resolution: {integrity: sha512-TFi4HBKSGfIKsK5YCkKaaFG2m4PEDyViZmEwof3MTIgzimHLto6muaHVpbrljdIvIrFZzEq/p4nafOeLcYegrg==} engines: {node: '>=0.3.0'} @@ -791,6 +808,10 @@ packages: resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} engines: {node: '>= 6.0.0'} + agentkeepalive@4.5.0: + resolution: {integrity: sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==} + engines: {node: '>= 8.0.0'} + aggregate-error@3.1.0: resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} engines: {node: '>=8'} @@ -798,8 +819,8 @@ packages: ajv@6.12.6: resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} - ajv@8.16.0: - resolution: {integrity: sha512-F0twR8U1ZU67JIEtekUcLkXkoO5mMMmgGD8sK/xUFzJ805jxHQl92hImFAqqXMyMYjSPOyUPAwHYhB72g5sTXw==} + ajv@8.17.1: + resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==} amdefine@1.0.1: resolution: {integrity: sha512-S2Hw0TtNkMJhIabBwIojKL9YHO5T0n5eNqWJ7Lrlel/zDbftQpxpapi8tZs3X1HWa+u+QeydGmzzNU0m09+Rcg==} @@ -832,8 +853,8 @@ packages: resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} engines: {node: '>=8'} - antlr4@4.13.1: - resolution: {integrity: sha512-kiXTspaRYvnIArgE97z5YVVf/cDVQABr3abFRR6mE7yesLMkgu4ujuyV/sgxafQ8wgve0DJQUJ38Z8tkgA2izA==} + antlr4@4.13.2: + resolution: {integrity: sha512-QiVbZhyy4xAZ17UPEuG3YTOt8ZaoeOR1CvEAqrEsDBsOqINslaB147i9xqljZqoyf5S+EUlGStaj+t22LT9MOg==} engines: {node: '>=16'} antlr4ts@0.5.0-alpha.4: @@ -843,6 +864,14 @@ packages: resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} engines: {node: '>= 8'} + aproba@2.0.0: + resolution: {integrity: sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==} + + are-we-there-yet@3.0.1: + resolution: {integrity: sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + deprecated: This package is no longer supported. + arg@4.1.3: resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} @@ -898,8 +927,8 @@ packages: axios@0.21.4: resolution: {integrity: sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==} - axios@1.7.2: - resolution: {integrity: sha512-2A8QhOMrbomlDuiLeK9XibIBzuHeRcqqNOHp0Cyp5EoJ1IFDh+XZH3A6BkXtv0K4gFGCI0Y4BM7B1wOEi0Rmgw==} + axios@1.7.3: + resolution: {integrity: sha512-Ar7ND9pU99eJ9GpoGQKhKf58GpUOgnzuaB7ueNQ5BMi0p+LZ5oaEnfF999fAArcTIBwXTCHAmGcHOZJaWPq9Nw==} balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} @@ -924,6 +953,9 @@ packages: bindings@1.5.0: resolution: {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==} + bl@4.1.0: + resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} + blakejs@1.2.1: resolution: {integrity: sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ==} @@ -971,6 +1003,9 @@ packages: buffer-xor@1.0.3: resolution: {integrity: sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==} + buffer@5.7.1: + resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + buffer@6.0.3: resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} @@ -978,6 +1013,10 @@ packages: resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} engines: {node: '>= 0.8'} + cacache@15.3.0: + resolution: {integrity: sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ==} + engines: {node: '>= 10'} + call-bind@1.0.7: resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} engines: {node: '>= 0.4'} @@ -1002,8 +1041,8 @@ packages: peerDependencies: chai: '>= 2.1.2 < 6' - chai@4.4.1: - resolution: {integrity: sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g==} + chai@4.5.0: + resolution: {integrity: sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw==} engines: {node: '>=4'} chalk@2.4.2: @@ -1024,6 +1063,13 @@ packages: resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} engines: {node: '>= 8.10.0'} + chownr@1.1.4: + resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} + + chownr@2.0.0: + resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} + engines: {node: '>=10'} + ci-info@2.0.0: resolution: {integrity: sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==} @@ -1058,6 +1104,10 @@ packages: color-name@1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + color-support@1.1.3: + resolution: {integrity: sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==} + hasBin: true + colors@1.4.0: resolution: {integrity: sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==} engines: {node: '>=0.1.90'} @@ -1096,6 +1146,9 @@ packages: resolution: {integrity: sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==} engines: {'0': node >= 0.8} + console-control-strings@1.1.0: + resolution: {integrity: sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==} + cookie@0.4.2: resolution: {integrity: sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==} engines: {node: '>= 0.6'} @@ -1136,8 +1189,8 @@ packages: death@1.1.0: resolution: {integrity: sha512-vsV6S4KVHvTGxbEcij7hkWRv0It+sGGWVOM67dQde/o5Xjnr+KmLjxWJii2uEObIrt1CcM9w0Yaovx+iOlIL+w==} - debug@4.3.5: - resolution: {integrity: sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==} + debug@4.3.6: + resolution: {integrity: sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==} engines: {node: '>=6.0'} peerDependencies: supports-color: '*' @@ -1149,6 +1202,10 @@ packages: resolution: {integrity: sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==} engines: {node: '>=10'} + decompress-response@6.0.0: + resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} + engines: {node: '>=10'} + deep-eql@4.1.4: resolution: {integrity: sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==} engines: {node: '>=6'} @@ -1168,14 +1225,16 @@ packages: resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} engines: {node: '>=0.4.0'} + delegates@1.0.0: + resolution: {integrity: sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==} + depd@2.0.0: resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} engines: {node: '>= 0.8'} - detect-port@1.6.1: - resolution: {integrity: sha512-CmnVc+Hek2egPx1PeTFVta2W78xy2K/9Rkf6cC4T59S50tVnzKj+tnx5mmx5lwvCkujZ4uRrpRSuV+IVs3f90Q==} - engines: {node: '>= 4.0.0'} - hasBin: true + detect-libc@2.0.3: + resolution: {integrity: sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==} + engines: {node: '>=8'} diff@4.0.2: resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} @@ -1203,8 +1262,8 @@ packages: elliptic@6.5.4: resolution: {integrity: sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==} - elliptic@6.5.5: - resolution: {integrity: sha512-7EjbcmUm17NQFu4Pmgmq2olYMj8nwMnpcddByChSUjArp8F5DQWcIcpriwO4ZToLNAJig0yiyjswfyGNje/ixw==} + elliptic@6.5.6: + resolution: {integrity: sha512-mpzdtpeCLuS3BmE3pO3Cpp5bbjlOPY2Q0PgoF+Od1XZrHLYI28Xe3ossCmYCQt11FQKEYd9+PF8jymTvtWJSHQ==} emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} @@ -1212,6 +1271,12 @@ packages: encode-utf8@1.0.3: resolution: {integrity: sha512-ucAnuBEhUK4boH2HjVYG5Q2mQyPorvv0u/ocS+zhdw0S8AlHYY+GOFhP1Gio5z4icpP2ivFSvhtFjQi8+T9ppw==} + encoding@0.1.13: + resolution: {integrity: sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==} + + end-of-stream@1.4.4: + resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} + enquirer@2.4.1: resolution: {integrity: sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==} engines: {node: '>=8.6'} @@ -1220,6 +1285,9 @@ packages: resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} engines: {node: '>=6'} + err-code@2.0.3: + resolution: {integrity: sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==} + error-ex@1.3.2: resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} @@ -1285,8 +1353,8 @@ packages: engines: {node: '>=4'} hasBin: true - esquery@1.5.0: - resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} + esquery@1.6.0: + resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} engines: {node: '>=0.10'} esrecurse@4.3.0: @@ -1317,8 +1385,8 @@ packages: '@codechecks/client': optional: true - ethereum-bloom-filters@1.1.0: - resolution: {integrity: sha512-J1gDRkLpuGNvWYzWslBQR9cDV4nd4kfvVTE/Wy4Kkm4yb3EYRSlyi0eB/inTsSTTVyA0+HyzHgbr95Fn/Z1fSw==} + ethereum-bloom-filters@1.2.0: + resolution: {integrity: sha512-28hyiE7HVsWubqhpVLVmZXFd4ITeHi+BUu05o9isf0GUpMtzBUi+8/gFrGaGYzvGAJQmJ3JKj77Mk9G98T84rA==} ethereum-cryptography@0.1.3: resolution: {integrity: sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==} @@ -1342,8 +1410,8 @@ packages: ethers@5.7.2: resolution: {integrity: sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg==} - ethers@6.13.1: - resolution: {integrity: sha512-hdJ2HOxg/xx97Lm9HdCWk949BfYqYWpyw4//78SiwOLgASyfrNszfMUNB2joKjvGUdwhHfaiMMFFwacVVoLR9A==} + ethers@6.13.2: + resolution: {integrity: sha512-9VkriTTed+/27BGuY1s0hf441kqwHJ1wtN2edksEtiRvXx+soxRX3iSXTfFqq2+YwrOqbDoTHjIhQnjJRlzKmg==} engines: {node: '>=14.0.0'} ethjs-unit@0.1.6: @@ -1357,6 +1425,13 @@ packages: evp_bytestokey@1.0.3: resolution: {integrity: sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==} + expand-template@2.0.3: + resolution: {integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==} + engines: {node: '>=6'} + + extra-bigint@1.1.18: + resolution: {integrity: sha512-edCTFKhq84Htzmg3MTii8TNsyQlIIG5k9f/OJ7/PrX80Ob57GXtIW6PJt/UqRvyCa4TgYKhmYVRfQfajL3ku0w==} + fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} @@ -1373,11 +1448,14 @@ packages: fast-levenshtein@2.0.6: resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + fast-uri@3.0.1: + resolution: {integrity: sha512-MWipKbbYiYI0UC7cl8m/i/IWTqfC8YXsqjzybjddLsFjStroQzsHXkc73JutMvBiXmOvapk+axIl79ig5t55Bw==} + fastq@1.17.1: resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} - fhevm@0.5.3: - resolution: {integrity: sha512-S5GVEXGxpwPlQLWL2k/xNGjRHiANGHdsWJWPu0Ns3iZfk8TYNcRacYk4bfCtw1xNXzp2AVriKRFBIdOJsmJB0A==} + fhevm@0.5.5: + resolution: {integrity: sha512-0iPp6/IGx+O1go92LVSoZhBcnnSaSjlb3FazxUWJ0R38B/fSe5EZizZnM7vxnjLgBxwUDx0jGkTmc5S5ZEBNuw==} engines: {node: '>=20.0.0'} fhevmjs@0.5.2: @@ -1445,6 +1523,9 @@ packages: fp-ts@1.19.3: resolution: {integrity: sha512-H5KQDspykdHuztLTg+ajGN0Z2qUjcEf3Ybxc6hLt0k7/zPkn29XnKnxlBPyW2XIddWrGaJBzBl4VLYOtk39yZg==} + fs-constants@1.0.0: + resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} + fs-extra@10.1.0: resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} engines: {node: '>=12'} @@ -1461,6 +1542,10 @@ packages: resolution: {integrity: sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==} engines: {node: '>=10'} + fs-minipass@2.1.0: + resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} + engines: {node: '>= 8'} + fs-readdir-recursive@1.1.0: resolution: {integrity: sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA==} @@ -1475,6 +1560,11 @@ packages: function-bind@1.1.2: resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + gauge@4.0.4: + resolution: {integrity: sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + deprecated: This package is no longer supported. + get-caller-file@2.0.5: resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} engines: {node: 6.* || 8.* || >= 10.*} @@ -1494,6 +1584,9 @@ packages: resolution: {integrity: sha512-i08dAEgJ2g8z5buJIrCTduwPIhih3DP+hOCTyyryikfV8T0bNvHnGXO67i0DD1H4GBDETTclPy9njZbfluQYrQ==} hasBin: true + github-from-package@0.0.0: + resolution: {integrity: sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==} + glob-parent@5.1.2: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} @@ -1581,8 +1674,8 @@ packages: peerDependencies: hardhat: ^2.0.5 - hardhat@2.22.6: - resolution: {integrity: sha512-abFEnd9QACwEtSvZZGSmzvw7N3zhQN1cDKz5SLHAupfG24qTHofCjqvD5kT5Wwsq5XOL0ON1Mq5rr4v0XX5ciw==} + hardhat@2.22.8: + resolution: {integrity: sha512-hPh2feBGRswkXkoXUFW6NbxgiYtEzp/3uvVFjYROy6fA9LH8BobUyxStlyhSKj4+v1Y23ZoUBOVWL84IcLACrA==} hasBin: true peerDependencies: ts-node: '*' @@ -1620,6 +1713,9 @@ packages: resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} engines: {node: '>= 0.4'} + has-unicode@2.0.1: + resolution: {integrity: sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==} + hash-base@3.1.0: resolution: {integrity: sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==} engines: {node: '>=4'} @@ -1645,10 +1741,17 @@ packages: resolution: {integrity: sha512-/EcDMwJZh3mABI2NhGfHOGOeOZITqfkEO4p/xK+l3NpyncIHUQBoMvCSF/b5GqvKtySC2srL/GGG3+EtlqlmCw==} engines: {node: '>=6.0.0'} + http-cache-semantics@4.1.1: + resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==} + http-errors@2.0.0: resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} engines: {node: '>= 0.8'} + http-proxy-agent@4.0.1: + resolution: {integrity: sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==} + engines: {node: '>= 6'} + http-response-object@3.0.2: resolution: {integrity: sha512-bqX0XTF6fnXSQcEJ2Iuyr75yVakyjIDCqroJQ/aHfSdlM743Cwqoi2nDYMzLGWUcuTWGWy8AAvOKXTfiv6q9RA==} @@ -1656,10 +1759,17 @@ packages: resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} engines: {node: '>= 6'} + humanize-ms@1.2.1: + resolution: {integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==} + iconv-lite@0.4.24: resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} engines: {node: '>=0.10.0'} + iconv-lite@0.6.3: + resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} + engines: {node: '>=0.10.0'} + ieee754@1.2.1: resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} @@ -1667,8 +1777,8 @@ packages: resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==} engines: {node: '>= 4'} - immutable@4.3.6: - resolution: {integrity: sha512-Ju0+lEMyzMVZarkTn/gqRpdqd5dOPaz1mCZ0SH3JV6iFw81PldE/PEB1hWVEA288HPt4WXW8O7AWxB10M+03QQ==} + immutable@4.3.7: + resolution: {integrity: sha512-1hqclzwYwjRDFLjcFxOM5AYkkG0rpFPpr1RLPMEuGczoS7YA8gLhy8SWXYRAA/XwfEHpfo3cw5JGioS32fnMRw==} import-fresh@3.3.0: resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} @@ -1686,6 +1796,9 @@ packages: resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} engines: {node: '>=8'} + infer-owner@1.0.4: + resolution: {integrity: sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==} + inflight@1.0.6: resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. @@ -1703,6 +1816,10 @@ packages: io-ts@1.10.4: resolution: {integrity: sha512-b23PteSnYXSONJ6JQXRAlvJhuw8KOtkqa87W4wDtvMrud/DTJd5X+NpOOI+O/zZwVq6v0VLAaJ+1EDViKEuN9g==} + ip-address@9.0.5: + resolution: {integrity: sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==} + engines: {node: '>= 12'} + is-arguments@1.1.1: resolution: {integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==} engines: {node: '>= 0.4'} @@ -1718,8 +1835,8 @@ packages: resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} engines: {node: '>= 0.4'} - is-core-module@2.14.0: - resolution: {integrity: sha512-a5dFJih5ZLYlRtDc0dZWP7RiKr6xIKzmn/oAYCDvdLThadVgyJwlaoQPmRtMSpz+rk0OGAgIu+TcM9HUF0fk1A==} + is-core-module@2.15.0: + resolution: {integrity: sha512-Dd+Lb2/zvk9SKy1TGCt1wFJFo/MWBPMX5x7KcvLajWTGuomczdQX61PvY5yK6SVACwpoexWo81IfFyoKY2QnTA==} engines: {node: '>= 0.4'} is-extglob@2.1.1: @@ -1746,6 +1863,9 @@ packages: resolution: {integrity: sha512-WvtOiug1VFrE9v1Cydwm+FnXd3+w9GaeVUss5W4v/SLy3UW00vP+6iNF2SdnfiBoLy4bTqVdkftNGTUeOFVsbA==} engines: {node: '>=6.5.0', npm: '>=3'} + is-lambda@1.0.1: + resolution: {integrity: sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==} + is-number@7.0.0: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} engines: {node: '>=0.12.0'} @@ -1789,6 +1909,9 @@ packages: resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} hasBin: true + jsbn@1.1.0: + resolution: {integrity: sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==} + jsesc@2.5.2: resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} engines: {node: '>=4'} @@ -1873,9 +1996,12 @@ packages: loupe@2.3.7: resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==} - lru-cache@10.3.1: - resolution: {integrity: sha512-9/8QXrtbGeMB6LxwQd4x1tIMnsmUxMvIH/qWGsccz6bt9Uln3S+sgAaqfQNhbGA8ufzs2fHuP/yqapGgP9Hh2g==} - engines: {node: '>=18'} + lru-cache@10.4.3: + resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} + + lru-cache@6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} lru_map@0.3.3: resolution: {integrity: sha512-Pn9cox5CsMYngeDbmChANltQl+5pi6XmTrraMSzhPmMBbmgcxmqWry0U3PGapCU1yB4/LqCcom7qhHZiF/jGfQ==} @@ -1883,6 +2009,10 @@ packages: make-error@1.3.6: resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} + make-fetch-happen@9.1.0: + resolution: {integrity: sha512-+zopwDy7DNknmwPQplem5lAZX/eCOzSvSNNcSKm5eVwTkOBzoktEfXsa9L23J/GIRhxRsaxzkPEhrJEpE2F4Gg==} + engines: {node: '>= 10'} + markdown-table@1.1.3: resolution: {integrity: sha512-1RUZVgQlpJSPWYbFSpmudq5nHY1doEIv89gBtF0s4gW1GF2XorxcA/70M5vq7rLv0a6mhOUccRsqkwhwLCIQ2Q==} @@ -1915,6 +2045,10 @@ packages: resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} engines: {node: '>= 0.6'} + mimic-response@3.1.0: + resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} + engines: {node: '>=10'} + minimalistic-assert@1.0.1: resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==} @@ -1935,14 +2069,49 @@ packages: minimist@1.2.8: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + minipass-collect@1.0.2: + resolution: {integrity: sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==} + engines: {node: '>= 8'} + + minipass-fetch@1.4.1: + resolution: {integrity: sha512-CGH1eblLq26Y15+Azk7ey4xh0J/XfJfrCox5LDJiKqI2Q2iwOLOKrlmIaODiSQS8d18jalF6y2K2ePUm0CmShw==} + engines: {node: '>=8'} + + minipass-flush@1.0.5: + resolution: {integrity: sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==} + engines: {node: '>= 8'} + + minipass-pipeline@1.2.4: + resolution: {integrity: sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==} + engines: {node: '>=8'} + + minipass-sized@1.0.3: + resolution: {integrity: sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==} + engines: {node: '>=8'} + + minipass@3.3.6: + resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==} + engines: {node: '>=8'} + minipass@4.2.8: resolution: {integrity: sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==} engines: {node: '>=8'} + minipass@5.0.0: + resolution: {integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==} + engines: {node: '>=8'} + minipass@7.1.2: resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} engines: {node: '>=16 || 14 >=14.17'} + minizlib@2.1.2: + resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} + engines: {node: '>= 8'} + + mkdirp-classic@0.5.3: + resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} + mkdirp@0.5.6: resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} hasBin: true @@ -1955,8 +2124,8 @@ packages: mnemonist@0.38.5: resolution: {integrity: sha512-bZTFT5rrPKtPJxj8KSV0WkPyNxl72vQepqqVUAW2ARUpUSF2qXMB6jZj7hW5/k7C1rtpzqbD/IIbJwLXUjCHeg==} - mocha@10.6.0: - resolution: {integrity: sha512-hxjt4+EEB0SA0ZDygSS015t65lJw/I2yRCS3Ae+SJ5FrbzrXgfYwJr96f0OvIXdj7h4lv/vLCrH3rkiuizFSvw==} + mocha@10.7.3: + resolution: {integrity: sha512-uQWxAu44wwiACGqjbPYmjo7Lg8sFrS3dQe7PP2FQI+woptP4vZXSMcfMyFL/e1yFEeEpV4RtyTpZROOKmxis+A==} engines: {node: '>= 14.0.0'} hasBin: true @@ -1969,18 +2138,32 @@ packages: murmur-128@0.2.1: resolution: {integrity: sha512-WseEgiRkI6aMFBbj8Cg9yBj/y+OdipwVC7zUo3W2W1JAJITwouUOtpqsmGSg67EQmwwSyod7hsVsWY5LsrfQVg==} + napi-build-utils@1.0.2: + resolution: {integrity: sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==} + natural-compare-lite@1.4.0: resolution: {integrity: sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==} natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + negotiator@0.6.3: + resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} + engines: {node: '>= 0.6'} + neo-async@2.6.2: resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} + node-abi@3.65.0: + resolution: {integrity: sha512-ThjYBfoDNr08AWx6hGaRbfPwxKV9kVzAzOzlLKbk2CuqXE2xnCh+cbAGnwM3t8Lq4v9rUB7VfondlkBckcJrVA==} + engines: {node: '>=10'} + node-addon-api@2.0.2: resolution: {integrity: sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==} + node-addon-api@7.1.1: + resolution: {integrity: sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==} + node-emoji@1.11.0: resolution: {integrity: sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==} @@ -1997,6 +2180,11 @@ packages: resolution: {integrity: sha512-OSs33Z9yWr148JZcbZd5WiAXhh/n9z8TxQcdMhIOlpN9AhWpLfvVFO73+m77bBABQMaY9XSvIa+qk0jlI7Gcaw==} hasBin: true + node-gyp@8.4.1: + resolution: {integrity: sha512-olTJRgUtAb/hOXG0E93wZDs5YiJlgbXxTwQAFHyNlRsXQnYzUaF2aGgujZbw+hR8aF4ZG/rST57bWMWD16jr9w==} + engines: {node: '>= 10.12.0'} + hasBin: true + node-interval-tree@2.1.2: resolution: {integrity: sha512-bJ9zMDuNGzVQg1xv0bCPzyEDxHgbrx7/xGj6CDokvizZZmastPsOh0JJLuY8wA5q2SfX1TLNMk7XNV8WxbGxzA==} engines: {node: '>= 14.0.0'} @@ -2012,10 +2200,20 @@ packages: resolution: {integrity: sha512-4GUt3kSEYmk4ITxzB/b9vaIDfUVWN/Ml1Fwl11IlnIG2iaJ9O6WXZ9SrYM9NLI8OCBieN2Y8SWC2oJV0RQ7qYg==} hasBin: true + nopt@5.0.0: + resolution: {integrity: sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==} + engines: {node: '>=6'} + hasBin: true + normalize-path@3.0.0: resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} engines: {node: '>=0.10.0'} + npmlog@6.0.2: + resolution: {integrity: sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + deprecated: This package is no longer supported. + number-to-bn@1.7.0: resolution: {integrity: sha512-wsJ9gfSz1/s4ZsJN01lyonwuxA1tml6X1yBDnfpMglypcBRFZZkus26EdPSlqS5GJfYddVZa22p3VNb3z5m5Ig==} engines: {node: '>=6.5.0', npm: '>=3'} @@ -2137,6 +2335,11 @@ packages: resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==} engines: {node: '>= 0.4'} + prebuild-install@7.1.2: + resolution: {integrity: sha512-UnNke3IQb6sgarcZIDU3gbMeTp/9SSU1DAIkil7PrqG1vZlBtY5msYccSKSHDqa3hNg436IXK+SNImReuA1wEQ==} + engines: {node: '>=10'} + hasBin: true + prelude-ls@1.1.2: resolution: {integrity: sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==} engines: {node: '>= 0.8.0'} @@ -2163,12 +2366,27 @@ packages: process-nextick-args@2.0.1: resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + promise-inflight@1.0.1: + resolution: {integrity: sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==} + peerDependencies: + bluebird: '*' + peerDependenciesMeta: + bluebird: + optional: true + + promise-retry@2.0.1: + resolution: {integrity: sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==} + engines: {node: '>=10'} + promise@8.3.0: resolution: {integrity: sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==} proxy-from-env@1.1.0: resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} + pump@3.0.0: + resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} + punycode@1.4.1: resolution: {integrity: sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==} @@ -2176,8 +2394,8 @@ packages: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} - qs@6.12.2: - resolution: {integrity: sha512-x+NLUpx9SYrcwXtX7ob1gnkSems4i/mGZX5SlYxwIau6RrUSODO89TR/XDGGpn5RPWSYIB+aSfuSlV5+CmbTBg==} + qs@6.13.0: + resolution: {integrity: sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==} engines: {node: '>=0.6'} queue-microtask@1.2.3: @@ -2190,6 +2408,10 @@ packages: resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==} engines: {node: '>= 0.8'} + rc@1.2.8: + resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} + hasBin: true + readable-stream@2.3.8: resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} @@ -2247,6 +2469,10 @@ packages: resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} hasBin: true + retry@0.12.0: + resolution: {integrity: sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==} + engines: {node: '>= 4'} + reusify@1.0.4: resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} @@ -2299,14 +2525,17 @@ packages: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true - semver@7.6.2: - resolution: {integrity: sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==} + semver@7.6.3: + resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==} engines: {node: '>=10'} hasBin: true serialize-javascript@6.0.2: resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} + set-blocking@2.0.0: + resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} + set-function-length@1.2.2: resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} engines: {node: '>= 0.4'} @@ -2347,6 +2576,15 @@ packages: resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==} engines: {node: '>= 0.4'} + signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + + simple-concat@1.0.1: + resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==} + + simple-get@4.0.1: + resolution: {integrity: sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==} + slash@3.0.0: resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} engines: {node: '>=8'} @@ -2355,6 +2593,18 @@ packages: resolution: {integrity: sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==} engines: {node: '>=10'} + smart-buffer@4.2.0: + resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==} + engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} + + socks-proxy-agent@6.2.1: + resolution: {integrity: sha512-a6KW9G+6B3nWZ1yB8G7pJwL3ggLy1uTzKAgCb7ttblwqdz9fMGJUuTy3uFzEP48FAs9FLILlmzDlE2JJhVQaXQ==} + engines: {node: '>= 10'} + + socks@2.8.3: + resolution: {integrity: sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw==} + engines: {node: '>= 10.0.0', npm: '>= 3.0.0'} + solc@0.8.26: resolution: {integrity: sha512-yiPQNVf5rBFHwN6SIf3TUUvVAFKcQqmSUFeq+fb6pNRCo0ZCgpYOZDi3BVoezCPIAcKrVYd/qXlBLUP9wVrZ9g==} engines: {node: '>=10.0.0'} @@ -2412,7 +2662,6 @@ packages: solidity-comments-linux-x64-gnu@0.1.1: resolution: {integrity: sha512-oiU4yhh1Q9SeGXQ+/sogfTNoOkU8I8IvlIeotBQziTOonUHrxQk4E63kNiYGPDn5ZbB3BhKFmGHNRNrkufsxcQ==} engines: {node: '>= 10'} - cpu: [x64] os: [linux] solidity-comments-linux-x64-musl@0.0.2: @@ -2443,8 +2692,8 @@ packages: resolution: {integrity: sha512-G+aK6qtyUfkn1guS8uzqUeua1dURwPlcOjoTYW/TwmXAcE7z/1+oGCfZUdMSe4ZMKklNbVZNiG5ibnF8gkkFfw==} engines: {node: '>= 12'} - solidity-coverage@0.8.6: - resolution: {integrity: sha512-vV03mA/0nNMskOdVwNarUcqk0N/aYdelxAbf6RZ5l84FcYHbqDTr2JXyeYMp4bT48qHtAQjnKrygW1FrECyWNw==} + solidity-coverage@0.8.12: + resolution: {integrity: sha512-8cOB1PtjnjFRqOgwFiD8DaUsYJtVJ6+YdXQtSZDrLGf8cdhhh8xzTtGzVTGeBf15kTv0v7lYPJlV/az7zLEPJw==} hasBin: true peerDependencies: hardhat: ^2.11.0 @@ -2467,6 +2716,16 @@ packages: sprintf-js@1.0.3: resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + sprintf-js@1.1.3: + resolution: {integrity: sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==} + + sqlite3@5.1.7: + resolution: {integrity: sha512-GGIyOiFaG+TUra3JIfkI/zGP8yZYLPQ0pl1bH+ODjiX57sPhrLU5sQJn1y9bDKZUFYkX1crlrPfSYt0BKKdkog==} + + ssri@8.0.1: + resolution: {integrity: sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==} + engines: {node: '>= 8'} + stacktrace-parser@0.1.10: resolution: {integrity: sha512-KJP1OCML99+8fhOHxwwzyWrlUuVX5GQ0ZpJTd1DFXhdkrvg1szxfHhawXUZ3g9TkXORQd4/WG68jMlQZ2p8wlg==} engines: {node: '>=6'} @@ -2504,6 +2763,10 @@ packages: resolution: {integrity: sha512-q8d4ue7JGEiVcypji1bALTos+0pWtyGlivAWyPuTkHzuTCJqrK9sWxYQZUq6Nq3cuyv3bm734IhHvHtGGURU6A==} engines: {node: '>=6.5.0', npm: '>=3'} + strip-json-comments@2.0.1: + resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} + engines: {node: '>=0.10.0'} + strip-json-comments@3.1.1: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} @@ -2543,6 +2806,17 @@ packages: resolution: {integrity: sha512-w2sfv80nrAh2VCbqR5AK27wswXhqcck2AhfnNW76beQXskGZ1V12GwS//yYVa3d3fcvAip2OUnbDAjW2k3v9fA==} engines: {node: '>=10.0.0'} + tar-fs@2.1.1: + resolution: {integrity: sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==} + + tar-stream@2.2.0: + resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} + engines: {node: '>=6'} + + tar@6.2.1: + resolution: {integrity: sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==} + engines: {node: '>=10'} + text-table@0.2.0: resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} @@ -2617,6 +2891,9 @@ packages: peerDependencies: typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' + tunnel-agent@0.6.0: + resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} + tweetnacl-util@0.15.1: resolution: {integrity: sha512-RKJBIj8lySrShN4w6i/BonWp2Z/uxwC3h4y7xsRrpP59ZboCd0GpEVsOnMDYLMmKBpYhb5TgHzZXy7wTfYFBRw==} @@ -2631,8 +2908,8 @@ packages: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} - type-detect@4.0.8: - resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} + type-detect@4.1.0: + resolution: {integrity: sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==} engines: {node: '>=4'} type-fest@0.20.2: @@ -2656,8 +2933,8 @@ packages: typedarray@0.0.6: resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==} - typescript@5.5.3: - resolution: {integrity: sha512-/hreyEujaB0w76zKo6717l3L0o/qEUtRgdvUBvlkhoWeOVMjMuHNHk0BRBzikzuGDqNmPQbg5ifMEqsHLiIUcQ==} + typescript@5.5.4: + resolution: {integrity: sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==} engines: {node: '>=14.17'} hasBin: true @@ -2669,8 +2946,8 @@ packages: resolution: {integrity: sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==} engines: {node: '>=8'} - uglify-js@3.18.0: - resolution: {integrity: sha512-SyVVbcNBCk0dzr9XL/R/ySrmYf0s372K6/hFklzgcp2lBFyXtw4I7BOdDjlLhE1aVqaI/SHWXWmYdlZxuyF38A==} + uglify-js@3.19.2: + resolution: {integrity: sha512-S8KA6DDI47nQXJSi2ctQ629YzwOVs+bQML6DAtvy0wgNdpi+0ySpQK0g2pxBq2xfF2z3YCscu7NNA8nXT9PlIQ==} engines: {node: '>=0.8.0'} hasBin: true @@ -2681,6 +2958,12 @@ packages: resolution: {integrity: sha512-72RFADWFqKmUb2hmmvNODKL3p9hcB6Gt2DOQMis1SEBaV6a4MH8soBvzg+95CYhCKPFedut2JY9bMfrDl9D23g==} engines: {node: '>=14.0'} + unique-filename@1.1.1: + resolution: {integrity: sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==} + + unique-slug@2.0.2: + resolution: {integrity: sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==} + universalify@0.1.2: resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} engines: {node: '>= 4.0.0'} @@ -2696,8 +2979,9 @@ packages: uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} - url@0.11.3: - resolution: {integrity: sha512-6hxOLGfZASQK/cijlZnZJTq8OXAkt/3YGfQX45vvMYXpZoo8NdWZcY73K108Jf759lS1Bv/8wXnHDTSz17dSRw==} + url@0.11.4: + resolution: {integrity: sha512-oCwdVC7mTuWiPyjLUz/COz5TLk6wgp0RCsN+wHZ2Ekneac9w8uuV0njcbbie2ME+Vs+d6duwmYuR3HgQXs1fOg==} + engines: {node: '>= 0.4'} utf8@3.0.0: resolution: {integrity: sha512-E8VjFIQ/TyQgp+TZfS6l8yp/xWppSAHzidGiRrqe4bK4XP9pTRyKFgGJpO3SN7zdX4DeomTrwaseCHovfpFcqQ==} @@ -2715,8 +2999,8 @@ packages: v8-compile-cache-lib@3.0.1: resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} - web3-errors@1.2.0: - resolution: {integrity: sha512-58Kczou5zyjcm9LuSs5Hrm6VrG8t9p2J8X0yGArZrhKNPZL66gMGkOUpPx+EopE944Sk4yE+Q25hKv4H5BH+kA==} + web3-errors@1.2.1: + resolution: {integrity: sha512-dIsi8SFC9TCAWpPmacXeVMk/F8tDNa1Bvg8/Cc2cvJo8LRSWd099szEyb+/SiMYcLlEbwftiT9Rpukz7ql4hBg==} engines: {node: '>=14', npm: '>=6.12.0'} web3-types@1.7.0: @@ -2750,6 +3034,9 @@ packages: engines: {node: '>= 8'} hasBin: true + wide-align@1.1.5: + resolution: {integrity: sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==} + widest-line@3.1.0: resolution: {integrity: sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==} engines: {node: '>=8'} @@ -2815,6 +3102,9 @@ packages: resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} engines: {node: '>=10'} + yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + yargs-parser@20.2.9: resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} engines: {node: '>=10'} @@ -2859,31 +3149,31 @@ snapshots: jsesc: 2.5.2 source-map: 0.5.7 - '@babel/generator@7.24.7': + '@babel/generator@7.25.0': dependencies: - '@babel/types': 7.24.7 + '@babel/types': 7.25.2 '@jridgewell/gen-mapping': 0.3.5 '@jridgewell/trace-mapping': 0.3.25 jsesc: 2.5.2 '@babel/helper-environment-visitor@7.24.7': dependencies: - '@babel/types': 7.24.7 + '@babel/types': 7.25.2 '@babel/helper-function-name@7.24.7': dependencies: - '@babel/template': 7.24.7 - '@babel/types': 7.24.7 + '@babel/template': 7.25.0 + '@babel/types': 7.25.2 '@babel/helper-hoist-variables@7.24.7': dependencies: - '@babel/types': 7.24.7 + '@babel/types': 7.25.2 '@babel/helper-split-export-declaration@7.24.7': dependencies: - '@babel/types': 7.24.7 + '@babel/types': 7.25.2 - '@babel/helper-string-parser@7.24.7': {} + '@babel/helper-string-parser@7.24.8': {} '@babel/helper-validator-identifier@7.24.7': {} @@ -2894,27 +3184,27 @@ snapshots: js-tokens: 4.0.0 picocolors: 1.0.1 - '@babel/parser@7.24.7': + '@babel/parser@7.25.3': dependencies: - '@babel/types': 7.17.0 + '@babel/types': 7.25.2 - '@babel/template@7.24.7': + '@babel/template@7.25.0': dependencies: '@babel/code-frame': 7.24.7 - '@babel/parser': 7.24.7 - '@babel/types': 7.24.7 + '@babel/parser': 7.25.3 + '@babel/types': 7.25.2 '@babel/traverse@7.23.2': dependencies: '@babel/code-frame': 7.24.7 - '@babel/generator': 7.24.7 + '@babel/generator': 7.25.0 '@babel/helper-environment-visitor': 7.24.7 '@babel/helper-function-name': 7.24.7 '@babel/helper-hoist-variables': 7.24.7 '@babel/helper-split-export-declaration': 7.24.7 - '@babel/parser': 7.24.7 - '@babel/types': 7.24.7 - debug: 4.3.5(supports-color@8.1.1) + '@babel/parser': 7.25.3 + '@babel/types': 7.25.2 + debug: 4.3.6(supports-color@8.1.1) globals: 11.12.0 transitivePeerDependencies: - supports-color @@ -2924,9 +3214,9 @@ snapshots: '@babel/helper-validator-identifier': 7.24.7 to-fast-properties: 2.0.0 - '@babel/types@7.24.7': + '@babel/types@7.25.2': dependencies: - '@babel/helper-string-parser': 7.24.7 + '@babel/helper-string-parser': 7.24.8 '@babel/helper-validator-identifier': 7.24.7 to-fast-properties: 2.0.0 @@ -2944,7 +3234,7 @@ snapshots: '@eslint/eslintrc@2.1.4': dependencies: ajv: 6.12.6 - debug: 4.3.5(supports-color@8.1.1) + debug: 4.3.6(supports-color@8.1.1) espree: 9.6.1 globals: 13.24.0 ignore: 5.3.1 @@ -3222,10 +3512,13 @@ snapshots: '@fastify/busboy@2.1.1': {} + '@gar/promisify@1.1.3': + optional: true + '@humanwhocodes/config-array@0.11.14': dependencies: '@humanwhocodes/object-schema': 2.0.3 - debug: 4.3.5(supports-color@8.1.1) + debug: 4.3.6(supports-color@8.1.1) minimatch: 3.1.2 transitivePeerDependencies: - supports-color @@ -3237,24 +3530,24 @@ snapshots: '@jridgewell/gen-mapping@0.3.5': dependencies: '@jridgewell/set-array': 1.2.1 - '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/sourcemap-codec': 1.5.0 '@jridgewell/trace-mapping': 0.3.25 '@jridgewell/resolve-uri@3.1.2': {} '@jridgewell/set-array@1.2.1': {} - '@jridgewell/sourcemap-codec@1.4.15': {} + '@jridgewell/sourcemap-codec@1.5.0': {} '@jridgewell/trace-mapping@0.3.25': dependencies: '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/sourcemap-codec': 1.5.0 '@jridgewell/trace-mapping@0.3.9': dependencies: '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/sourcemap-codec': 1.5.0 '@metamask/eth-sig-util@4.0.1': dependencies: @@ -3292,29 +3585,29 @@ snapshots: '@nodelib/fs.scandir': 2.1.5 fastq: 1.17.1 - '@nomicfoundation/edr-darwin-arm64@0.4.1': {} + '@nomicfoundation/edr-darwin-arm64@0.5.2': {} - '@nomicfoundation/edr-darwin-x64@0.4.1': {} + '@nomicfoundation/edr-darwin-x64@0.5.2': {} - '@nomicfoundation/edr-linux-arm64-gnu@0.4.1': {} + '@nomicfoundation/edr-linux-arm64-gnu@0.5.2': {} - '@nomicfoundation/edr-linux-arm64-musl@0.4.1': {} + '@nomicfoundation/edr-linux-arm64-musl@0.5.2': {} - '@nomicfoundation/edr-linux-x64-gnu@0.4.1': {} + '@nomicfoundation/edr-linux-x64-gnu@0.5.2': {} - '@nomicfoundation/edr-linux-x64-musl@0.4.1': {} + '@nomicfoundation/edr-linux-x64-musl@0.5.2': {} - '@nomicfoundation/edr-win32-x64-msvc@0.4.1': {} + '@nomicfoundation/edr-win32-x64-msvc@0.5.2': {} - '@nomicfoundation/edr@0.4.1': + '@nomicfoundation/edr@0.5.2': dependencies: - '@nomicfoundation/edr-darwin-arm64': 0.4.1 - '@nomicfoundation/edr-darwin-x64': 0.4.1 - '@nomicfoundation/edr-linux-arm64-gnu': 0.4.1 - '@nomicfoundation/edr-linux-arm64-musl': 0.4.1 - '@nomicfoundation/edr-linux-x64-gnu': 0.4.1 - '@nomicfoundation/edr-linux-x64-musl': 0.4.1 - '@nomicfoundation/edr-win32-x64-msvc': 0.4.1 + '@nomicfoundation/edr-darwin-arm64': 0.5.2 + '@nomicfoundation/edr-darwin-x64': 0.5.2 + '@nomicfoundation/edr-linux-arm64-gnu': 0.5.2 + '@nomicfoundation/edr-linux-arm64-musl': 0.5.2 + '@nomicfoundation/edr-linux-x64-gnu': 0.5.2 + '@nomicfoundation/edr-linux-x64-musl': 0.5.2 + '@nomicfoundation/edr-win32-x64-msvc': 0.5.2 '@nomicfoundation/ethereumjs-common@4.0.4': dependencies: @@ -3336,59 +3629,59 @@ snapshots: '@nomicfoundation/ethereumjs-rlp': 5.0.4 ethereum-cryptography: 0.1.3 - '@nomicfoundation/hardhat-chai-matchers@2.0.7(@nomicfoundation/hardhat-ethers@3.0.6(ethers@6.13.1)(hardhat@2.22.6(ts-node@10.9.2(@types/node@18.19.39)(typescript@5.5.3))(typescript@5.5.3)))(chai@4.4.1)(ethers@6.13.1)(hardhat@2.22.6(ts-node@10.9.2(@types/node@18.19.39)(typescript@5.5.3))(typescript@5.5.3))': + '@nomicfoundation/hardhat-chai-matchers@2.0.7(@nomicfoundation/hardhat-ethers@3.0.6(ethers@6.13.2)(hardhat@2.22.8(ts-node@10.9.2(@types/node@18.19.44)(typescript@5.5.4))(typescript@5.5.4)))(chai@4.5.0)(ethers@6.13.2)(hardhat@2.22.8(ts-node@10.9.2(@types/node@18.19.44)(typescript@5.5.4))(typescript@5.5.4))': dependencies: - '@nomicfoundation/hardhat-ethers': 3.0.6(ethers@6.13.1)(hardhat@2.22.6(ts-node@10.9.2(@types/node@18.19.39)(typescript@5.5.3))(typescript@5.5.3)) + '@nomicfoundation/hardhat-ethers': 3.0.6(ethers@6.13.2)(hardhat@2.22.8(ts-node@10.9.2(@types/node@18.19.44)(typescript@5.5.4))(typescript@5.5.4)) '@types/chai-as-promised': 7.1.8 - chai: 4.4.1 - chai-as-promised: 7.1.2(chai@4.4.1) + chai: 4.5.0 + chai-as-promised: 7.1.2(chai@4.5.0) deep-eql: 4.1.4 - ethers: 6.13.1 - hardhat: 2.22.6(ts-node@10.9.2(@types/node@18.19.39)(typescript@5.5.3))(typescript@5.5.3) + ethers: 6.13.2 + hardhat: 2.22.8(ts-node@10.9.2(@types/node@18.19.44)(typescript@5.5.4))(typescript@5.5.4) ordinal: 1.0.3 - '@nomicfoundation/hardhat-ethers@3.0.6(ethers@6.13.1)(hardhat@2.22.6(ts-node@10.9.2(@types/node@18.19.39)(typescript@5.5.3))(typescript@5.5.3))': + '@nomicfoundation/hardhat-ethers@3.0.6(ethers@6.13.2)(hardhat@2.22.8(ts-node@10.9.2(@types/node@18.19.44)(typescript@5.5.4))(typescript@5.5.4))': dependencies: - debug: 4.3.5(supports-color@8.1.1) - ethers: 6.13.1 - hardhat: 2.22.6(ts-node@10.9.2(@types/node@18.19.39)(typescript@5.5.3))(typescript@5.5.3) + debug: 4.3.6(supports-color@8.1.1) + ethers: 6.13.2 + hardhat: 2.22.8(ts-node@10.9.2(@types/node@18.19.44)(typescript@5.5.4))(typescript@5.5.4) lodash.isequal: 4.5.0 transitivePeerDependencies: - supports-color - '@nomicfoundation/hardhat-network-helpers@1.0.11(hardhat@2.22.6(ts-node@10.9.2(@types/node@18.19.39)(typescript@5.5.3))(typescript@5.5.3))': + '@nomicfoundation/hardhat-network-helpers@1.0.11(hardhat@2.22.8(ts-node@10.9.2(@types/node@18.19.44)(typescript@5.5.4))(typescript@5.5.4))': dependencies: ethereumjs-util: 7.1.5 - hardhat: 2.22.6(ts-node@10.9.2(@types/node@18.19.39)(typescript@5.5.3))(typescript@5.5.3) + hardhat: 2.22.8(ts-node@10.9.2(@types/node@18.19.44)(typescript@5.5.4))(typescript@5.5.4) - '@nomicfoundation/hardhat-toolbox@3.0.0(lbpcol4eomcrshoanzytc66lfi)': + '@nomicfoundation/hardhat-toolbox@3.0.0(geae4jvdfg2eknoy6ku3h4qpgy)': dependencies: - '@nomicfoundation/hardhat-chai-matchers': 2.0.7(@nomicfoundation/hardhat-ethers@3.0.6(ethers@6.13.1)(hardhat@2.22.6(ts-node@10.9.2(@types/node@18.19.39)(typescript@5.5.3))(typescript@5.5.3)))(chai@4.4.1)(ethers@6.13.1)(hardhat@2.22.6(ts-node@10.9.2(@types/node@18.19.39)(typescript@5.5.3))(typescript@5.5.3)) - '@nomicfoundation/hardhat-ethers': 3.0.6(ethers@6.13.1)(hardhat@2.22.6(ts-node@10.9.2(@types/node@18.19.39)(typescript@5.5.3))(typescript@5.5.3)) - '@nomicfoundation/hardhat-network-helpers': 1.0.11(hardhat@2.22.6(ts-node@10.9.2(@types/node@18.19.39)(typescript@5.5.3))(typescript@5.5.3)) - '@nomicfoundation/hardhat-verify': 1.1.1(hardhat@2.22.6(ts-node@10.9.2(@types/node@18.19.39)(typescript@5.5.3))(typescript@5.5.3)) - '@typechain/ethers-v6': 0.4.3(ethers@6.13.1)(typechain@8.3.2(typescript@5.5.3))(typescript@5.5.3) - '@typechain/hardhat': 8.0.3(@typechain/ethers-v6@0.4.3(ethers@6.13.1)(typechain@8.3.2(typescript@5.5.3))(typescript@5.5.3))(ethers@6.13.1)(hardhat@2.22.6(ts-node@10.9.2(@types/node@18.19.39)(typescript@5.5.3))(typescript@5.5.3))(typechain@8.3.2(typescript@5.5.3)) - '@types/chai': 4.3.16 + '@nomicfoundation/hardhat-chai-matchers': 2.0.7(@nomicfoundation/hardhat-ethers@3.0.6(ethers@6.13.2)(hardhat@2.22.8(ts-node@10.9.2(@types/node@18.19.44)(typescript@5.5.4))(typescript@5.5.4)))(chai@4.5.0)(ethers@6.13.2)(hardhat@2.22.8(ts-node@10.9.2(@types/node@18.19.44)(typescript@5.5.4))(typescript@5.5.4)) + '@nomicfoundation/hardhat-ethers': 3.0.6(ethers@6.13.2)(hardhat@2.22.8(ts-node@10.9.2(@types/node@18.19.44)(typescript@5.5.4))(typescript@5.5.4)) + '@nomicfoundation/hardhat-network-helpers': 1.0.11(hardhat@2.22.8(ts-node@10.9.2(@types/node@18.19.44)(typescript@5.5.4))(typescript@5.5.4)) + '@nomicfoundation/hardhat-verify': 1.1.1(hardhat@2.22.8(ts-node@10.9.2(@types/node@18.19.44)(typescript@5.5.4))(typescript@5.5.4)) + '@typechain/ethers-v6': 0.4.3(ethers@6.13.2)(typechain@8.3.2(typescript@5.5.4))(typescript@5.5.4) + '@typechain/hardhat': 8.0.3(@typechain/ethers-v6@0.4.3(ethers@6.13.2)(typechain@8.3.2(typescript@5.5.4))(typescript@5.5.4))(ethers@6.13.2)(hardhat@2.22.8(ts-node@10.9.2(@types/node@18.19.44)(typescript@5.5.4))(typescript@5.5.4))(typechain@8.3.2(typescript@5.5.4)) + '@types/chai': 4.3.17 '@types/mocha': 10.0.7 - '@types/node': 18.19.39 - chai: 4.4.1 - ethers: 6.13.1 - hardhat: 2.22.6(ts-node@10.9.2(@types/node@18.19.39)(typescript@5.5.3))(typescript@5.5.3) - hardhat-gas-reporter: 1.0.10(hardhat@2.22.6(ts-node@10.9.2(@types/node@18.19.39)(typescript@5.5.3))(typescript@5.5.3)) - solidity-coverage: 0.8.6(hardhat@2.22.6(ts-node@10.9.2(@types/node@18.19.39)(typescript@5.5.3))(typescript@5.5.3)) - ts-node: 10.9.2(@types/node@18.19.39)(typescript@5.5.3) - typechain: 8.3.2(typescript@5.5.3) - typescript: 5.5.3 - - '@nomicfoundation/hardhat-verify@1.1.1(hardhat@2.22.6(ts-node@10.9.2(@types/node@18.19.39)(typescript@5.5.3))(typescript@5.5.3))': + '@types/node': 18.19.44 + chai: 4.5.0 + ethers: 6.13.2 + hardhat: 2.22.8(ts-node@10.9.2(@types/node@18.19.44)(typescript@5.5.4))(typescript@5.5.4) + hardhat-gas-reporter: 1.0.10(hardhat@2.22.8(ts-node@10.9.2(@types/node@18.19.44)(typescript@5.5.4))(typescript@5.5.4)) + solidity-coverage: 0.8.12(hardhat@2.22.8(ts-node@10.9.2(@types/node@18.19.44)(typescript@5.5.4))(typescript@5.5.4)) + ts-node: 10.9.2(@types/node@18.19.44)(typescript@5.5.4) + typechain: 8.3.2(typescript@5.5.4) + typescript: 5.5.4 + + '@nomicfoundation/hardhat-verify@1.1.1(hardhat@2.22.8(ts-node@10.9.2(@types/node@18.19.44)(typescript@5.5.4))(typescript@5.5.4))': dependencies: '@ethersproject/abi': 5.7.0 '@ethersproject/address': 5.7.0 cbor: 8.1.0 chalk: 2.4.2 - debug: 4.3.5(supports-color@8.1.1) - hardhat: 2.22.6(ts-node@10.9.2(@types/node@18.19.39)(typescript@5.5.3))(typescript@5.5.3) + debug: 4.3.6(supports-color@8.1.1) + hardhat: 2.22.8(ts-node@10.9.2(@types/node@18.19.44)(typescript@5.5.4))(typescript@5.5.4) lodash.clonedeep: 4.5.0 semver: 6.3.1 table: 6.8.2 @@ -3427,6 +3720,18 @@ snapshots: '@nomicfoundation/solidity-analyzer-linux-x64-musl': 0.1.2 '@nomicfoundation/solidity-analyzer-win32-x64-msvc': 0.1.2 + '@npmcli/fs@1.1.1': + dependencies: + '@gar/promisify': 1.1.3 + semver: 7.6.3 + optional: true + + '@npmcli/move-file@1.1.2': + dependencies: + mkdirp: 1.0.4 + rimraf: 3.0.2 + optional: true + '@openzeppelin/contracts@5.0.2': {} '@scure/base@1.1.7': {} @@ -3514,10 +3819,13 @@ snapshots: '@solidity-parser/parser@0.18.0': {} + '@tootallnate/once@1.1.2': + optional: true + '@trivago/prettier-plugin-sort-imports@4.3.0(prettier@2.8.8)': dependencies: '@babel/generator': 7.17.7 - '@babel/parser': 7.24.7 + '@babel/parser': 7.25.3 '@babel/traverse': 7.23.2 '@babel/types': 7.17.0 javascript-natural-sort: 0.7.1 @@ -3534,58 +3842,58 @@ snapshots: '@tsconfig/node16@1.0.4': {} - '@typechain/ethers-v6@0.4.3(ethers@6.13.1)(typechain@8.3.2(typescript@5.5.3))(typescript@5.5.3)': + '@typechain/ethers-v6@0.4.3(ethers@6.13.2)(typechain@8.3.2(typescript@5.5.4))(typescript@5.5.4)': dependencies: - ethers: 6.13.1 + ethers: 6.13.2 lodash: 4.17.21 - ts-essentials: 7.0.3(typescript@5.5.3) - typechain: 8.3.2(typescript@5.5.3) - typescript: 5.5.3 + ts-essentials: 7.0.3(typescript@5.5.4) + typechain: 8.3.2(typescript@5.5.4) + typescript: 5.5.4 - '@typechain/hardhat@8.0.3(@typechain/ethers-v6@0.4.3(ethers@6.13.1)(typechain@8.3.2(typescript@5.5.3))(typescript@5.5.3))(ethers@6.13.1)(hardhat@2.22.6(ts-node@10.9.2(@types/node@18.19.39)(typescript@5.5.3))(typescript@5.5.3))(typechain@8.3.2(typescript@5.5.3))': + '@typechain/hardhat@8.0.3(@typechain/ethers-v6@0.4.3(ethers@6.13.2)(typechain@8.3.2(typescript@5.5.4))(typescript@5.5.4))(ethers@6.13.2)(hardhat@2.22.8(ts-node@10.9.2(@types/node@18.19.44)(typescript@5.5.4))(typescript@5.5.4))(typechain@8.3.2(typescript@5.5.4))': dependencies: - '@typechain/ethers-v6': 0.4.3(ethers@6.13.1)(typechain@8.3.2(typescript@5.5.3))(typescript@5.5.3) - ethers: 6.13.1 + '@typechain/ethers-v6': 0.4.3(ethers@6.13.2)(typechain@8.3.2(typescript@5.5.4))(typescript@5.5.4) + ethers: 6.13.2 fs-extra: 9.1.0 - hardhat: 2.22.6(ts-node@10.9.2(@types/node@18.19.39)(typescript@5.5.3))(typescript@5.5.3) - typechain: 8.3.2(typescript@5.5.3) + hardhat: 2.22.8(ts-node@10.9.2(@types/node@18.19.44)(typescript@5.5.4))(typescript@5.5.4) + typechain: 8.3.2(typescript@5.5.4) '@types/bn.js@4.11.6': dependencies: - '@types/node': 18.19.39 + '@types/node': 18.19.44 '@types/bn.js@5.1.5': dependencies: - '@types/node': 18.19.39 + '@types/node': 18.19.44 '@types/chai-as-promised@7.1.8': dependencies: - '@types/chai': 4.3.16 + '@types/chai': 4.3.17 - '@types/chai@4.3.16': {} + '@types/chai@4.3.17': {} '@types/concat-stream@1.6.1': dependencies: - '@types/node': 18.19.39 + '@types/node': 18.19.44 '@types/form-data@0.0.33': dependencies: - '@types/node': 18.19.39 + '@types/node': 18.19.44 '@types/fs-extra@9.0.13': dependencies: - '@types/node': 18.19.39 + '@types/node': 18.19.44 '@types/glob@7.2.0': dependencies: '@types/minimatch': 5.1.2 - '@types/node': 18.19.39 + '@types/node': 18.19.44 '@types/json-schema@7.0.15': {} '@types/keccak@3.0.4': dependencies: - '@types/node': 18.19.39 + '@types/node': 18.19.44 '@types/lru-cache@5.1.1': {} @@ -3593,7 +3901,7 @@ snapshots: '@types/mkdirp@0.5.2': dependencies: - '@types/node': 18.19.39 + '@types/node': 18.19.44 '@types/mocha@10.0.7': {} @@ -3601,7 +3909,7 @@ snapshots: '@types/node@18.15.13': {} - '@types/node@18.19.39': + '@types/node@18.19.44': dependencies: undici-types: 5.26.5 @@ -3609,7 +3917,7 @@ snapshots: '@types/pbkdf2@3.1.2': dependencies: - '@types/node': 18.19.39 + '@types/node': 18.19.44 '@types/prettier@2.7.3': {} @@ -3617,42 +3925,42 @@ snapshots: '@types/resolve@0.0.8': dependencies: - '@types/node': 18.19.39 + '@types/node': 18.19.44 '@types/secp256k1@4.0.6': dependencies: - '@types/node': 18.19.39 + '@types/node': 18.19.44 '@types/semver@7.5.8': {} - '@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.5.3))(eslint@8.57.0)(typescript@5.5.3)': + '@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.5.4))(eslint@8.57.0)(typescript@5.5.4)': dependencies: '@eslint-community/regexpp': 4.11.0 - '@typescript-eslint/parser': 5.62.0(eslint@8.57.0)(typescript@5.5.3) + '@typescript-eslint/parser': 5.62.0(eslint@8.57.0)(typescript@5.5.4) '@typescript-eslint/scope-manager': 5.62.0 - '@typescript-eslint/type-utils': 5.62.0(eslint@8.57.0)(typescript@5.5.3) - '@typescript-eslint/utils': 5.62.0(eslint@8.57.0)(typescript@5.5.3) - debug: 4.3.5(supports-color@8.1.1) + '@typescript-eslint/type-utils': 5.62.0(eslint@8.57.0)(typescript@5.5.4) + '@typescript-eslint/utils': 5.62.0(eslint@8.57.0)(typescript@5.5.4) + debug: 4.3.6(supports-color@8.1.1) eslint: 8.57.0 graphemer: 1.4.0 ignore: 5.3.1 natural-compare-lite: 1.4.0 - semver: 7.6.2 - tsutils: 3.21.0(typescript@5.5.3) + semver: 7.6.3 + tsutils: 3.21.0(typescript@5.5.4) optionalDependencies: - typescript: 5.5.3 + typescript: 5.5.4 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.5.3)': + '@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.5.4)': dependencies: '@typescript-eslint/scope-manager': 5.62.0 '@typescript-eslint/types': 5.62.0 - '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.5.3) - debug: 4.3.5(supports-color@8.1.1) + '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.5.4) + debug: 4.3.6(supports-color@8.1.1) eslint: 8.57.0 optionalDependencies: - typescript: 5.5.3 + typescript: 5.5.4 transitivePeerDependencies: - supports-color @@ -3661,45 +3969,45 @@ snapshots: '@typescript-eslint/types': 5.62.0 '@typescript-eslint/visitor-keys': 5.62.0 - '@typescript-eslint/type-utils@5.62.0(eslint@8.57.0)(typescript@5.5.3)': + '@typescript-eslint/type-utils@5.62.0(eslint@8.57.0)(typescript@5.5.4)': dependencies: - '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.5.3) - '@typescript-eslint/utils': 5.62.0(eslint@8.57.0)(typescript@5.5.3) - debug: 4.3.5(supports-color@8.1.1) + '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.5.4) + '@typescript-eslint/utils': 5.62.0(eslint@8.57.0)(typescript@5.5.4) + debug: 4.3.6(supports-color@8.1.1) eslint: 8.57.0 - tsutils: 3.21.0(typescript@5.5.3) + tsutils: 3.21.0(typescript@5.5.4) optionalDependencies: - typescript: 5.5.3 + typescript: 5.5.4 transitivePeerDependencies: - supports-color '@typescript-eslint/types@5.62.0': {} - '@typescript-eslint/typescript-estree@5.62.0(typescript@5.5.3)': + '@typescript-eslint/typescript-estree@5.62.0(typescript@5.5.4)': dependencies: '@typescript-eslint/types': 5.62.0 '@typescript-eslint/visitor-keys': 5.62.0 - debug: 4.3.5(supports-color@8.1.1) + debug: 4.3.6(supports-color@8.1.1) globby: 11.1.0 is-glob: 4.0.3 - semver: 7.6.2 - tsutils: 3.21.0(typescript@5.5.3) + semver: 7.6.3 + tsutils: 3.21.0(typescript@5.5.4) optionalDependencies: - typescript: 5.5.3 + typescript: 5.5.4 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@5.62.0(eslint@8.57.0)(typescript@5.5.3)': + '@typescript-eslint/utils@5.62.0(eslint@8.57.0)(typescript@5.5.4)': dependencies: '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) '@types/json-schema': 7.0.15 '@types/semver': 7.5.8 '@typescript-eslint/scope-manager': 5.62.0 '@typescript-eslint/types': 5.62.0 - '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.5.3) + '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.5.4) eslint: 8.57.0 eslint-scope: 5.1.1 - semver: 7.6.2 + semver: 7.6.3 transitivePeerDependencies: - supports-color - typescript @@ -3723,8 +4031,6 @@ snapshots: acorn@8.12.1: {} - address@1.2.2: {} - adm-zip@0.4.16: {} aes-js@3.0.0: {} @@ -3733,10 +4039,15 @@ snapshots: agent-base@6.0.2: dependencies: - debug: 4.3.5(supports-color@8.1.1) + debug: 4.3.6(supports-color@8.1.1) transitivePeerDependencies: - supports-color + agentkeepalive@4.5.0: + dependencies: + humanize-ms: 1.2.1 + optional: true + aggregate-error@3.1.0: dependencies: clean-stack: 2.2.0 @@ -3749,12 +4060,12 @@ snapshots: json-schema-traverse: 0.4.1 uri-js: 4.4.1 - ajv@8.16.0: + ajv@8.17.1: dependencies: fast-deep-equal: 3.1.3 + fast-uri: 3.0.1 json-schema-traverse: 1.0.0 require-from-string: 2.0.2 - uri-js: 4.4.1 amdefine@1.0.1: optional: true @@ -3781,7 +4092,7 @@ snapshots: dependencies: color-convert: 2.0.1 - antlr4@4.13.1: {} + antlr4@4.13.2: {} antlr4ts@0.5.0-alpha.4: {} @@ -3790,6 +4101,15 @@ snapshots: normalize-path: 3.0.0 picomatch: 2.3.1 + aproba@2.0.0: + optional: true + + are-we-there-yet@3.0.1: + dependencies: + delegates: 1.0.0 + readable-stream: 3.6.2 + optional: true + arg@4.1.3: {} argparse@1.0.10: @@ -3824,15 +4144,15 @@ snapshots: dependencies: possible-typed-array-names: 1.0.0 - axios@0.21.4(debug@4.3.5): + axios@0.21.4(debug@4.3.6): dependencies: - follow-redirects: 1.15.6(debug@4.3.5) + follow-redirects: 1.15.6(debug@4.3.6) transitivePeerDependencies: - debug - axios@1.7.2: + axios@1.7.3: dependencies: - follow-redirects: 1.15.6(debug@4.3.5) + follow-redirects: 1.15.6(debug@4.3.6) form-data: 4.0.0 proxy-from-env: 1.1.0 transitivePeerDependencies: @@ -3858,6 +4178,12 @@ snapshots: dependencies: file-uri-to-path: 1.0.0 + bl@4.1.0: + dependencies: + buffer: 5.7.1 + inherits: 2.0.4 + readable-stream: 3.6.2 + blakejs@1.2.1: {} bn.js@4.11.6: {} @@ -3917,6 +4243,11 @@ snapshots: buffer-xor@1.0.3: {} + buffer@5.7.1: + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + buffer@6.0.3: dependencies: base64-js: 1.5.1 @@ -3924,6 +4255,30 @@ snapshots: bytes@3.1.2: {} + cacache@15.3.0: + dependencies: + '@npmcli/fs': 1.1.1 + '@npmcli/move-file': 1.1.2 + chownr: 2.0.0 + fs-minipass: 2.1.0 + glob: 7.2.3 + infer-owner: 1.0.4 + lru-cache: 6.0.0 + minipass: 3.3.6 + minipass-collect: 1.0.2 + minipass-flush: 1.0.5 + minipass-pipeline: 1.2.4 + mkdirp: 1.0.4 + p-map: 4.0.0 + promise-inflight: 1.0.1 + rimraf: 3.0.2 + ssri: 8.0.1 + tar: 6.2.1 + unique-filename: 1.1.1 + transitivePeerDependencies: + - bluebird + optional: true + call-bind@1.0.7: dependencies: es-define-property: 1.0.0 @@ -3942,12 +4297,12 @@ snapshots: dependencies: nofilter: 3.1.0 - chai-as-promised@7.1.2(chai@4.4.1): + chai-as-promised@7.1.2(chai@4.5.0): dependencies: - chai: 4.4.1 + chai: 4.5.0 check-error: 1.0.3 - chai@4.4.1: + chai@4.5.0: dependencies: assertion-error: 1.1.0 check-error: 1.0.3 @@ -3955,7 +4310,7 @@ snapshots: get-func-name: 2.0.2 loupe: 2.3.7 pathval: 1.1.1 - type-detect: 4.0.8 + type-detect: 4.1.0 chalk@2.4.2: dependencies: @@ -3986,6 +4341,10 @@ snapshots: optionalDependencies: fsevents: 2.3.3 + chownr@1.1.4: {} + + chownr@2.0.0: {} + ci-info@2.0.0: {} cipher-base@1.0.4: @@ -4022,6 +4381,9 @@ snapshots: color-name@1.1.4: {} + color-support@1.1.3: + optional: true + colors@1.4.0: {} combined-stream@1.0.8: @@ -4059,18 +4421,21 @@ snapshots: readable-stream: 2.3.8 typedarray: 0.0.6 + console-control-strings@1.1.0: + optional: true + cookie@0.4.2: {} core-util-is@1.0.3: {} - cosmiconfig@8.3.6(typescript@5.5.3): + cosmiconfig@8.3.6(typescript@5.5.4): dependencies: import-fresh: 3.3.0 js-yaml: 4.1.0 parse-json: 5.2.0 path-type: 4.0.0 optionalDependencies: - typescript: 5.5.3 + typescript: 5.5.4 create-hash@1.2.0: dependencies: @@ -4105,7 +4470,7 @@ snapshots: death@1.1.0: {} - debug@4.3.5(supports-color@8.1.1): + debug@4.3.6(supports-color@8.1.1): dependencies: ms: 2.1.2 optionalDependencies: @@ -4113,9 +4478,13 @@ snapshots: decamelize@4.0.0: {} + decompress-response@6.0.0: + dependencies: + mimic-response: 3.1.0 + deep-eql@4.1.4: dependencies: - type-detect: 4.0.8 + type-detect: 4.1.0 deep-extend@0.6.0: {} @@ -4129,14 +4498,12 @@ snapshots: delayed-stream@1.0.0: {} + delegates@1.0.0: + optional: true + depd@2.0.0: {} - detect-port@1.6.1: - dependencies: - address: 1.2.2 - debug: 4.3.5(supports-color@8.1.1) - transitivePeerDependencies: - - supports-color + detect-libc@2.0.3: {} diff@4.0.2: {} @@ -4166,7 +4533,7 @@ snapshots: minimalistic-assert: 1.0.1 minimalistic-crypto-utils: 1.0.1 - elliptic@6.5.5: + elliptic@6.5.6: dependencies: bn.js: 4.12.0 brorand: 1.1.0 @@ -4180,6 +4547,15 @@ snapshots: encode-utf8@1.0.3: {} + encoding@0.1.13: + dependencies: + iconv-lite: 0.6.3 + optional: true + + end-of-stream@1.4.4: + dependencies: + once: 1.4.0 + enquirer@2.4.1: dependencies: ansi-colors: 4.1.3 @@ -4187,6 +4563,9 @@ snapshots: env-paths@2.2.1: {} + err-code@2.0.3: + optional: true + error-ex@1.3.2: dependencies: is-arrayish: 0.2.1 @@ -4241,13 +4620,13 @@ snapshots: ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.3 - debug: 4.3.5(supports-color@8.1.1) + debug: 4.3.6(supports-color@8.1.1) doctrine: 3.0.0 escape-string-regexp: 4.0.0 eslint-scope: 7.2.2 eslint-visitor-keys: 3.4.3 espree: 9.6.1 - esquery: 1.5.0 + esquery: 1.6.0 esutils: 2.0.3 fast-deep-equal: 3.1.3 file-entry-cache: 6.0.1 @@ -4281,7 +4660,7 @@ snapshots: esprima@4.0.1: {} - esquery@1.5.0: + esquery@1.6.0: dependencies: estraverse: 5.3.0 @@ -4300,7 +4679,7 @@ snapshots: eth-gas-reporter@0.2.27: dependencies: '@solidity-parser/parser': 0.14.5 - axios: 1.7.2 + axios: 1.7.3 cli-table3: 0.5.1 colors: 1.4.0 ethereum-cryptography: 1.2.0 @@ -4308,7 +4687,7 @@ snapshots: fs-readdir-recursive: 1.1.0 lodash: 4.17.21 markdown-table: 1.1.3 - mocha: 10.6.0 + mocha: 10.7.3 req-cwd: 2.0.0 sha1: 1.1.1 sync-request: 6.1.0 @@ -4317,7 +4696,7 @@ snapshots: - debug - utf-8-validate - ethereum-bloom-filters@1.1.0: + ethereum-bloom-filters@1.2.0: dependencies: '@noble/hashes': 1.4.0 @@ -4363,7 +4742,7 @@ snapshots: '@types/bn.js': 4.11.6 bn.js: 4.12.0 create-hash: 1.2.0 - elliptic: 6.5.5 + elliptic: 6.5.6 ethereum-cryptography: 0.1.3 ethjs-util: 0.1.6 rlp: 2.2.7 @@ -4412,7 +4791,7 @@ snapshots: - bufferutil - utf-8-validate - ethers@6.13.1: + ethers@6.13.2: dependencies: '@adraffy/ens-normalize': 1.10.1 '@noble/curves': 1.2.0 @@ -4440,6 +4819,10 @@ snapshots: md5.js: 1.3.5 safe-buffer: 5.2.1 + expand-template@2.0.3: {} + + extra-bigint@1.1.18: {} + fast-deep-equal@3.1.3: {} fast-diff@1.3.0: {} @@ -4456,25 +4839,27 @@ snapshots: fast-levenshtein@2.0.6: {} + fast-uri@3.0.1: {} + fastq@1.17.1: dependencies: reusify: 1.0.4 - fhevm@0.5.3: + fhevm@0.5.5: dependencies: '@openzeppelin/contracts': 5.0.2 solidity-comments-linux-x64-gnu: 0.1.1 - fhevmjs@0.5.2: + fhevmjs@0.5.2(encoding@0.1.13): dependencies: '@types/keccak': 3.0.4 bigint-buffer: 1.1.5 commander: 11.1.0 - node-fetch: 2.7.0 + node-fetch: 2.7.0(encoding@0.1.13) node-tfhe: 0.6.4 sha3: 2.1.4 tfhe: 0.6.4 - url: 0.11.3 + url: 0.11.4 web3-validator: 2.0.6 transitivePeerDependencies: - encoding @@ -4516,9 +4901,9 @@ snapshots: dependencies: imul: 1.0.1 - follow-redirects@1.15.6(debug@4.3.5): + follow-redirects@1.15.6(debug@4.3.6): optionalDependencies: - debug: 4.3.5(supports-color@8.1.1) + debug: 4.3.6(supports-color@8.1.1) for-each@0.3.3: dependencies: @@ -4538,6 +4923,8 @@ snapshots: fp-ts@1.19.3: {} + fs-constants@1.0.0: {} + fs-extra@10.1.0: dependencies: graceful-fs: 4.2.11 @@ -4563,6 +4950,10 @@ snapshots: jsonfile: 6.1.0 universalify: 2.0.1 + fs-minipass@2.1.0: + dependencies: + minipass: 3.3.6 + fs-readdir-recursive@1.1.0: {} fs.realpath@1.0.0: {} @@ -4572,6 +4963,18 @@ snapshots: function-bind@1.1.2: {} + gauge@4.0.4: + dependencies: + aproba: 2.0.0 + color-support: 1.1.3 + console-control-strings: 1.1.0 + has-unicode: 2.0.1 + signal-exit: 3.0.7 + string-width: 4.2.3 + strip-ansi: 6.0.1 + wide-align: 1.1.5 + optional: true + get-caller-file@2.0.5: {} get-func-name@2.0.2: {} @@ -4591,6 +4994,8 @@ snapshots: chalk: 2.4.2 node-emoji: 1.11.0 + github-from-package@0.0.0: {} + glob-parent@5.1.2: dependencies: is-glob: 4.0.3 @@ -4700,7 +5105,7 @@ snapshots: source-map: 0.6.1 wordwrap: 1.0.0 optionalDependencies: - uglify-js: 3.18.0 + uglify-js: 3.19.2 hardhat-deploy@0.11.45: dependencies: @@ -4716,28 +5121,28 @@ snapshots: '@ethersproject/transactions': 5.7.0 '@ethersproject/wallet': 5.7.0 '@types/qs': 6.9.15 - axios: 0.21.4(debug@4.3.5) + axios: 0.21.4(debug@4.3.6) chalk: 4.1.2 chokidar: 3.6.0 - debug: 4.3.5(supports-color@8.1.1) + debug: 4.3.6(supports-color@8.1.1) enquirer: 2.4.1 ethers: 5.7.2 form-data: 4.0.0 fs-extra: 10.1.0 match-all: 1.2.6 murmur-128: 0.2.1 - qs: 6.12.2 + qs: 6.13.0 zksync-web3: 0.14.4(ethers@5.7.2) transitivePeerDependencies: - bufferutil - supports-color - utf-8-validate - hardhat-gas-reporter@1.0.10(hardhat@2.22.6(ts-node@10.9.2(@types/node@18.19.39)(typescript@5.5.3))(typescript@5.5.3)): + hardhat-gas-reporter@1.0.10(hardhat@2.22.8(ts-node@10.9.2(@types/node@18.19.44)(typescript@5.5.4))(typescript@5.5.4)): dependencies: array-uniq: 1.0.3 eth-gas-reporter: 0.2.27 - hardhat: 2.22.6(ts-node@10.9.2(@types/node@18.19.39)(typescript@5.5.3))(typescript@5.5.3) + hardhat: 2.22.8(ts-node@10.9.2(@types/node@18.19.44)(typescript@5.5.4))(typescript@5.5.4) sha1: 1.1.1 transitivePeerDependencies: - '@codechecks/client' @@ -4751,16 +5156,16 @@ snapshots: node-interval-tree: 2.1.2 solidity-comments: 0.0.2 - hardhat-preprocessor@0.1.5(hardhat@2.22.6(ts-node@10.9.2(@types/node@18.19.39)(typescript@5.5.3))(typescript@5.5.3)): + hardhat-preprocessor@0.1.5(hardhat@2.22.8(ts-node@10.9.2(@types/node@18.19.44)(typescript@5.5.4))(typescript@5.5.4)): dependencies: - hardhat: 2.22.6(ts-node@10.9.2(@types/node@18.19.39)(typescript@5.5.3))(typescript@5.5.3) + hardhat: 2.22.8(ts-node@10.9.2(@types/node@18.19.44)(typescript@5.5.4))(typescript@5.5.4) murmur-128: 0.2.1 - hardhat@2.22.6(ts-node@10.9.2(@types/node@18.19.39)(typescript@5.5.3))(typescript@5.5.3): + hardhat@2.22.8(ts-node@10.9.2(@types/node@18.19.44)(typescript@5.5.4))(typescript@5.5.4): dependencies: '@ethersproject/abi': 5.7.0 '@metamask/eth-sig-util': 4.0.1 - '@nomicfoundation/edr': 0.4.1 + '@nomicfoundation/edr': 0.5.2 '@nomicfoundation/ethereumjs-common': 4.0.4 '@nomicfoundation/ethereumjs-tx': 5.0.4 '@nomicfoundation/ethereumjs-util': 9.0.4 @@ -4775,7 +5180,7 @@ snapshots: chalk: 2.4.2 chokidar: 3.6.0 ci-info: 2.0.0 - debug: 4.3.5(supports-color@8.1.1) + debug: 4.3.6(supports-color@8.1.1) enquirer: 2.4.1 env-paths: 2.2.1 ethereum-cryptography: 1.2.0 @@ -4784,17 +5189,17 @@ snapshots: fp-ts: 1.19.3 fs-extra: 7.0.1 glob: 7.2.0 - immutable: 4.3.6 + immutable: 4.3.7 io-ts: 1.10.4 keccak: 3.0.4 lodash: 4.17.21 mnemonist: 0.38.5 - mocha: 10.6.0 + mocha: 10.7.3 p-map: 4.0.0 raw-body: 2.5.2 resolve: 1.17.0 semver: 6.3.1 - solc: 0.8.26(debug@4.3.5) + solc: 0.8.26(debug@4.3.6) source-map-support: 0.5.21 stacktrace-parser: 0.1.10 tsort: 0.0.1 @@ -4802,8 +5207,8 @@ snapshots: uuid: 8.3.2 ws: 7.5.10 optionalDependencies: - ts-node: 10.9.2(@types/node@18.19.39)(typescript@5.5.3) - typescript: 5.5.3 + ts-node: 10.9.2(@types/node@18.19.44)(typescript@5.5.4) + typescript: 5.5.4 transitivePeerDependencies: - bufferutil - c-kzg @@ -4828,6 +5233,9 @@ snapshots: dependencies: has-symbols: 1.0.3 + has-unicode@2.0.1: + optional: true + hash-base@3.1.0: dependencies: inherits: 2.0.4 @@ -4860,6 +5268,9 @@ snapshots: http-response-object: 3.0.2 parse-cache-control: 1.0.1 + http-cache-semantics@4.1.1: + optional: true + http-errors@2.0.0: dependencies: depd: 2.0.0 @@ -4868,6 +5279,15 @@ snapshots: statuses: 2.0.1 toidentifier: 1.0.1 + http-proxy-agent@4.0.1: + dependencies: + '@tootallnate/once': 1.1.2 + agent-base: 6.0.2 + debug: 4.3.6(supports-color@8.1.1) + transitivePeerDependencies: + - supports-color + optional: true + http-response-object@3.0.2: dependencies: '@types/node': 10.17.60 @@ -4875,19 +5295,29 @@ snapshots: https-proxy-agent@5.0.1: dependencies: agent-base: 6.0.2 - debug: 4.3.5(supports-color@8.1.1) + debug: 4.3.6(supports-color@8.1.1) transitivePeerDependencies: - supports-color + humanize-ms@1.2.1: + dependencies: + ms: 2.1.3 + optional: true + iconv-lite@0.4.24: dependencies: safer-buffer: 2.1.2 + iconv-lite@0.6.3: + dependencies: + safer-buffer: 2.1.2 + optional: true + ieee754@1.2.1: {} ignore@5.3.1: {} - immutable@4.3.6: {} + immutable@4.3.7: {} import-fresh@3.3.0: dependencies: @@ -4900,6 +5330,9 @@ snapshots: indent-string@4.0.0: {} + infer-owner@1.0.4: + optional: true + inflight@1.0.6: dependencies: once: 1.4.0 @@ -4915,6 +5348,12 @@ snapshots: dependencies: fp-ts: 1.19.3 + ip-address@9.0.5: + dependencies: + jsbn: 1.1.0 + sprintf-js: 1.1.3 + optional: true + is-arguments@1.1.1: dependencies: call-bind: 1.0.7 @@ -4928,7 +5367,7 @@ snapshots: is-callable@1.2.7: {} - is-core-module@2.14.0: + is-core-module@2.15.0: dependencies: hasown: 2.0.2 @@ -4948,6 +5387,9 @@ snapshots: is-hex-prefixed@1.0.0: {} + is-lambda@1.0.1: + optional: true + is-number@7.0.0: {} is-path-inside@3.0.3: {} @@ -4979,6 +5421,9 @@ snapshots: dependencies: argparse: 2.0.1 + jsbn@1.1.0: + optional: true + jsesc@2.5.2: {} json-buffer@3.0.1: {} @@ -5057,12 +5502,40 @@ snapshots: dependencies: get-func-name: 2.0.2 - lru-cache@10.3.1: {} + lru-cache@10.4.3: {} + + lru-cache@6.0.0: + dependencies: + yallist: 4.0.0 + optional: true lru_map@0.3.3: {} make-error@1.3.6: {} + make-fetch-happen@9.1.0: + dependencies: + agentkeepalive: 4.5.0 + cacache: 15.3.0 + http-cache-semantics: 4.1.1 + http-proxy-agent: 4.0.1 + https-proxy-agent: 5.0.1 + is-lambda: 1.0.1 + lru-cache: 6.0.0 + minipass: 3.3.6 + minipass-collect: 1.0.2 + minipass-fetch: 1.4.1 + minipass-flush: 1.0.5 + minipass-pipeline: 1.2.4 + negotiator: 0.6.3 + promise-retry: 2.0.1 + socks-proxy-agent: 6.2.1 + ssri: 8.0.1 + transitivePeerDependencies: + - bluebird + - supports-color + optional: true + markdown-table@1.1.3: {} match-all@1.2.6: {} @@ -5090,6 +5563,8 @@ snapshots: dependencies: mime-db: 1.52.0 + mimic-response@3.1.0: {} + minimalistic-assert@1.0.1: {} minimalistic-crypto-utils@1.0.1: {} @@ -5108,10 +5583,52 @@ snapshots: minimist@1.2.8: {} + minipass-collect@1.0.2: + dependencies: + minipass: 3.3.6 + optional: true + + minipass-fetch@1.4.1: + dependencies: + minipass: 3.3.6 + minipass-sized: 1.0.3 + minizlib: 2.1.2 + optionalDependencies: + encoding: 0.1.13 + optional: true + + minipass-flush@1.0.5: + dependencies: + minipass: 3.3.6 + optional: true + + minipass-pipeline@1.2.4: + dependencies: + minipass: 3.3.6 + optional: true + + minipass-sized@1.0.3: + dependencies: + minipass: 3.3.6 + optional: true + + minipass@3.3.6: + dependencies: + yallist: 4.0.0 + minipass@4.2.8: {} + minipass@5.0.0: {} + minipass@7.1.2: {} + minizlib@2.1.2: + dependencies: + minipass: 3.3.6 + yallist: 4.0.0 + + mkdirp-classic@0.5.3: {} + mkdirp@0.5.6: dependencies: minimist: 1.2.8 @@ -5122,12 +5639,12 @@ snapshots: dependencies: obliterator: 2.0.4 - mocha@10.6.0: + mocha@10.7.3: dependencies: ansi-colors: 4.1.3 browser-stdout: 1.3.1 chokidar: 3.6.0 - debug: 4.3.5(supports-color@8.1.1) + debug: 4.3.6(supports-color@8.1.1) diff: 5.2.0 escape-string-regexp: 4.0.0 find-up: 5.0.0 @@ -5155,24 +5672,54 @@ snapshots: fmix: 0.1.0 imul: 1.0.1 + napi-build-utils@1.0.2: {} + natural-compare-lite@1.4.0: {} natural-compare@1.4.0: {} + negotiator@0.6.3: + optional: true + neo-async@2.6.2: {} + node-abi@3.65.0: + dependencies: + semver: 7.6.3 + node-addon-api@2.0.2: {} + node-addon-api@7.1.1: {} + node-emoji@1.11.0: dependencies: lodash: 4.17.21 - node-fetch@2.7.0: + node-fetch@2.7.0(encoding@0.1.13): dependencies: whatwg-url: 5.0.0 + optionalDependencies: + encoding: 0.1.13 node-gyp-build@4.8.1: {} + node-gyp@8.4.1: + dependencies: + env-paths: 2.2.1 + glob: 7.2.3 + graceful-fs: 4.2.11 + make-fetch-happen: 9.1.0 + nopt: 5.0.0 + npmlog: 6.0.2 + rimraf: 3.0.2 + semver: 7.6.3 + tar: 6.2.1 + which: 2.0.2 + transitivePeerDependencies: + - bluebird + - supports-color + optional: true + node-interval-tree@2.1.2: dependencies: shallowequal: 1.1.0 @@ -5185,8 +5732,21 @@ snapshots: dependencies: abbrev: 1.0.9 + nopt@5.0.0: + dependencies: + abbrev: 1.0.9 + optional: true + normalize-path@3.0.0: {} + npmlog@6.0.2: + dependencies: + are-we-there-yet: 3.0.1 + console-control-strings: 1.1.0 + gauge: 4.0.4 + set-blocking: 2.0.0 + optional: true + number-to-bn@1.7.0: dependencies: bn.js: 4.11.6 @@ -5271,7 +5831,7 @@ snapshots: path-scurry@1.11.1: dependencies: - lru-cache: 10.3.1 + lru-cache: 10.4.3 minipass: 7.1.2 path-type@4.0.0: {} @@ -5296,6 +5856,21 @@ snapshots: possible-typed-array-names@1.0.0: {} + prebuild-install@7.1.2: + dependencies: + detect-libc: 2.0.3 + expand-template: 2.0.3 + github-from-package: 0.0.0 + minimist: 1.2.8 + mkdirp-classic: 0.5.3 + napi-build-utils: 1.0.2 + node-abi: 3.65.0 + pump: 3.0.0 + rc: 1.2.8 + simple-get: 4.0.1 + tar-fs: 2.1.1 + tunnel-agent: 0.6.0 + prelude-ls@1.1.2: {} prelude-ls@1.2.1: {} @@ -5308,24 +5883,38 @@ snapshots: dependencies: '@solidity-parser/parser': 0.17.0 prettier: 2.8.8 - semver: 7.6.2 + semver: 7.6.3 solidity-comments-extractor: 0.0.8 prettier@2.8.8: {} process-nextick-args@2.0.1: {} + promise-inflight@1.0.1: + optional: true + + promise-retry@2.0.1: + dependencies: + err-code: 2.0.3 + retry: 0.12.0 + optional: true + promise@8.3.0: dependencies: asap: 2.0.6 proxy-from-env@1.1.0: {} + pump@3.0.0: + dependencies: + end-of-stream: 1.4.4 + once: 1.4.0 + punycode@1.4.1: {} punycode@2.3.1: {} - qs@6.12.2: + qs@6.13.0: dependencies: side-channel: 1.0.6 @@ -5342,6 +5931,13 @@ snapshots: iconv-lite: 0.4.24 unpipe: 1.0.0 + rc@1.2.8: + dependencies: + deep-extend: 0.6.0 + ini: 1.3.8 + minimist: 1.2.8 + strip-json-comments: 2.0.1 + readable-stream@2.3.8: dependencies: core-util-is: 1.0.3 @@ -5396,10 +5992,13 @@ snapshots: resolve@1.22.8: dependencies: - is-core-module: 2.14.0 + is-core-module: 2.15.0 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 + retry@0.12.0: + optional: true + reusify@1.0.4: {} rimraf@3.0.2: @@ -5450,7 +6049,7 @@ snapshots: secp256k1@4.0.3: dependencies: - elliptic: 6.5.5 + elliptic: 6.5.6 node-addon-api: 2.0.2 node-gyp-build: 4.8.1 @@ -5458,12 +6057,15 @@ snapshots: semver@6.3.1: {} - semver@7.6.2: {} + semver@7.6.3: {} serialize-javascript@6.0.2: dependencies: randombytes: 2.1.0 + set-blocking@2.0.0: + optional: true + set-function-length@1.2.2: dependencies: define-data-property: 1.1.4 @@ -5512,6 +6114,17 @@ snapshots: get-intrinsic: 1.2.4 object-inspect: 1.13.2 + signal-exit@3.0.7: + optional: true + + simple-concat@1.0.1: {} + + simple-get@4.0.1: + dependencies: + decompress-response: 6.0.0 + once: 1.4.0 + simple-concat: 1.0.1 + slash@3.0.0: {} slice-ansi@4.0.0: @@ -5520,11 +6133,29 @@ snapshots: astral-regex: 2.0.0 is-fullwidth-code-point: 3.0.0 - solc@0.8.26(debug@4.3.5): + smart-buffer@4.2.0: + optional: true + + socks-proxy-agent@6.2.1: + dependencies: + agent-base: 6.0.2 + debug: 4.3.6(supports-color@8.1.1) + socks: 2.8.3 + transitivePeerDependencies: + - supports-color + optional: true + + socks@2.8.3: + dependencies: + ip-address: 9.0.5 + smart-buffer: 4.2.0 + optional: true + + solc@0.8.26(debug@4.3.6): dependencies: command-exists: 1.2.9 commander: 8.3.0 - follow-redirects: 1.15.6(debug@4.3.5) + follow-redirects: 1.15.6(debug@4.3.6) js-sha3: 0.8.0 memorystream: 0.3.1 semver: 5.7.2 @@ -5538,22 +6169,22 @@ snapshots: prettier-linter-helpers: 1.0.0 prettier-plugin-solidity: 1.3.1(prettier@2.8.8) - solhint@3.6.2(typescript@5.5.3): + solhint@3.6.2(typescript@5.5.4): dependencies: '@solidity-parser/parser': 0.16.2 ajv: 6.12.6 - antlr4: 4.13.1 + antlr4: 4.13.2 ast-parents: 0.0.1 chalk: 4.1.2 commander: 10.0.1 - cosmiconfig: 8.3.6(typescript@5.5.3) + cosmiconfig: 8.3.6(typescript@5.5.4) fast-diff: 1.3.0 glob: 8.1.0 ignore: 5.3.1 js-yaml: 4.1.0 lodash: 4.17.21 pluralize: 8.0.0 - semver: 7.6.2 + semver: 7.6.3 strip-ansi: 6.0.1 table: 6.8.2 text-table: 0.2.0 @@ -5609,31 +6240,28 @@ snapshots: solidity-comments-win32-ia32-msvc: 0.0.2 solidity-comments-win32-x64-msvc: 0.0.2 - solidity-coverage@0.8.6(hardhat@2.22.6(ts-node@10.9.2(@types/node@18.19.39)(typescript@5.5.3))(typescript@5.5.3)): + solidity-coverage@0.8.12(hardhat@2.22.8(ts-node@10.9.2(@types/node@18.19.44)(typescript@5.5.4))(typescript@5.5.4)): dependencies: '@ethersproject/abi': 5.7.0 '@solidity-parser/parser': 0.18.0 chalk: 2.4.2 death: 1.1.0 - detect-port: 1.6.1 difflib: 0.2.4 fs-extra: 8.1.0 ghost-testrpc: 0.0.2 global-modules: 2.0.0 globby: 10.0.2 - hardhat: 2.22.6(ts-node@10.9.2(@types/node@18.19.39)(typescript@5.5.3))(typescript@5.5.3) + hardhat: 2.22.8(ts-node@10.9.2(@types/node@18.19.44)(typescript@5.5.4))(typescript@5.5.4) jsonschema: 1.4.1 lodash: 4.17.21 - mocha: 10.6.0 + mocha: 10.7.3 node-emoji: 1.11.0 pify: 4.0.1 recursive-readdir: 2.2.3 sc-istanbul: 0.4.6 - semver: 7.6.2 + semver: 7.6.3 shelljs: 0.8.5 web3-utils: 1.10.4 - transitivePeerDependencies: - - supports-color source-map-support@0.5.21: dependencies: @@ -5651,6 +6279,26 @@ snapshots: sprintf-js@1.0.3: {} + sprintf-js@1.1.3: + optional: true + + sqlite3@5.1.7: + dependencies: + bindings: 1.5.0 + node-addon-api: 7.1.1 + prebuild-install: 7.1.2 + tar: 6.2.1 + optionalDependencies: + node-gyp: 8.4.1 + transitivePeerDependencies: + - bluebird + - supports-color + + ssri@8.0.1: + dependencies: + minipass: 3.3.6 + optional: true + stacktrace-parser@0.1.10: dependencies: type-fest: 0.7.1 @@ -5690,6 +6338,8 @@ snapshots: dependencies: is-hex-prefixed: 1.0.0 + strip-json-comments@2.0.1: {} + strip-json-comments@3.1.1: {} supports-color@3.2.3: @@ -5729,12 +6379,36 @@ snapshots: table@6.8.2: dependencies: - ajv: 8.16.0 + ajv: 8.17.1 lodash.truncate: 4.4.2 slice-ansi: 4.0.0 string-width: 4.2.3 strip-ansi: 6.0.1 + tar-fs@2.1.1: + dependencies: + chownr: 1.1.4 + mkdirp-classic: 0.5.3 + pump: 3.0.0 + tar-stream: 2.2.0 + + tar-stream@2.2.0: + dependencies: + bl: 4.1.0 + end-of-stream: 1.4.4 + fs-constants: 1.0.0 + inherits: 2.0.4 + readable-stream: 3.6.2 + + tar@6.2.1: + dependencies: + chownr: 2.0.0 + fs-minipass: 2.1.0 + minipass: 5.0.0 + minizlib: 2.1.2 + mkdirp: 1.0.4 + yallist: 4.0.0 + text-table@0.2.0: {} tfhe@0.6.4: {} @@ -5751,7 +6425,7 @@ snapshots: http-basic: 8.1.3 http-response-object: 3.0.2 promise: 8.3.0 - qs: 6.12.2 + qs: 6.13.0 tmp@0.0.33: dependencies: @@ -5776,9 +6450,9 @@ snapshots: ts-essentials@1.0.4: {} - ts-essentials@7.0.3(typescript@5.5.3): + ts-essentials@7.0.3(typescript@5.5.4): dependencies: - typescript: 5.5.3 + typescript: 5.5.4 ts-generator@0.1.1: dependencies: @@ -5792,21 +6466,21 @@ snapshots: resolve: 1.22.8 ts-essentials: 1.0.4 - ts-node@10.9.2(@types/node@18.19.39)(typescript@5.5.3): + ts-node@10.9.2(@types/node@18.19.44)(typescript@5.5.4): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.11 '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 - '@types/node': 18.19.39 + '@types/node': 18.19.44 acorn: 8.12.1 acorn-walk: 8.3.3 arg: 4.1.3 create-require: 1.1.1 diff: 4.0.2 make-error: 1.3.6 - typescript: 5.5.3 + typescript: 5.5.4 v8-compile-cache-lib: 3.0.1 yn: 3.1.1 @@ -5816,10 +6490,14 @@ snapshots: tsort@0.0.1: {} - tsutils@3.21.0(typescript@5.5.3): + tsutils@3.21.0(typescript@5.5.4): dependencies: tslib: 1.14.1 - typescript: 5.5.3 + typescript: 5.5.4 + + tunnel-agent@0.6.0: + dependencies: + safe-buffer: 5.2.1 tweetnacl-util@0.15.1: {} @@ -5833,7 +6511,7 @@ snapshots: dependencies: prelude-ls: 1.2.1 - type-detect@4.0.8: {} + type-detect@4.1.0: {} type-fest@0.20.2: {} @@ -5841,10 +6519,10 @@ snapshots: type-fest@0.7.1: {} - typechain@8.3.2(typescript@5.5.3): + typechain@8.3.2(typescript@5.5.4): dependencies: '@types/prettier': 2.7.3 - debug: 4.3.5(supports-color@8.1.1) + debug: 4.3.6(supports-color@8.1.1) fs-extra: 7.0.1 glob: 7.1.7 js-sha3: 0.8.0 @@ -5852,20 +6530,20 @@ snapshots: mkdirp: 1.0.4 prettier: 2.8.8 ts-command-line-args: 2.5.1 - ts-essentials: 7.0.3(typescript@5.5.3) - typescript: 5.5.3 + ts-essentials: 7.0.3(typescript@5.5.4) + typescript: 5.5.4 transitivePeerDependencies: - supports-color typedarray@0.0.6: {} - typescript@5.5.3: {} + typescript@5.5.4: {} typical@4.0.0: {} typical@5.2.0: {} - uglify-js@3.18.0: + uglify-js@3.19.2: optional: true undici-types@5.26.5: {} @@ -5874,6 +6552,16 @@ snapshots: dependencies: '@fastify/busboy': 2.1.1 + unique-filename@1.1.1: + dependencies: + unique-slug: 2.0.2 + optional: true + + unique-slug@2.0.2: + dependencies: + imurmurhash: 0.1.4 + optional: true + universalify@0.1.2: {} universalify@2.0.1: {} @@ -5884,10 +6572,10 @@ snapshots: dependencies: punycode: 2.3.1 - url@0.11.3: + url@0.11.4: dependencies: punycode: 1.4.1 - qs: 6.12.2 + qs: 6.13.0 utf8@3.0.0: {} @@ -5905,7 +6593,7 @@ snapshots: v8-compile-cache-lib@3.0.1: {} - web3-errors@1.2.0: + web3-errors@1.2.1: dependencies: web3-types: 1.7.0 @@ -5915,7 +6603,7 @@ snapshots: dependencies: '@ethereumjs/util': 8.1.0 bn.js: 5.2.1 - ethereum-bloom-filters: 1.1.0 + ethereum-bloom-filters: 1.2.0 ethereum-cryptography: 2.2.1 ethjs-unit: 0.1.6 number-to-bn: 1.7.0 @@ -5926,7 +6614,7 @@ snapshots: dependencies: ethereum-cryptography: 2.2.1 util: 0.12.5 - web3-errors: 1.2.0 + web3-errors: 1.2.1 web3-types: 1.7.0 zod: 3.23.8 @@ -5953,6 +6641,11 @@ snapshots: dependencies: isexe: 2.0.0 + wide-align@1.1.5: + dependencies: + string-width: 4.2.3 + optional: true + widest-line@3.1.0: dependencies: string-width: 4.2.3 @@ -5984,6 +6677,8 @@ snapshots: y18n@5.0.8: {} + yallist@4.0.0: {} + yargs-parser@20.2.9: {} yargs-unparser@2.0.0: diff --git a/tasks/taskDeploy.ts b/tasks/taskDeploy.ts index e2a5f75..86888ce 100644 --- a/tasks/taskDeploy.ts +++ b/tasks/taskDeploy.ts @@ -9,7 +9,7 @@ task("task:deployGateway") .setAction(async function (taskArguments: TaskArguments, { ethers }) { const deployer = new ethers.Wallet(taskArguments.privateKey).connect(ethers.provider); const envConfig2 = dotenv.parse(fs.readFileSync("node_modules/fhevm/lib/.env.kmsverifier")); - const gatewayFactory = await ethers.getContractFactory("GatewayContract"); + const gatewayFactory = await ethers.getContractFactory("fhevm/gateway/GatewayContract.sol:GatewayContract"); const Gateway = await gatewayFactory .connect(deployer) .deploy(taskArguments.ownerAddress, envConfig2.KMS_VERIFIER_CONTRACT_ADDRESS); @@ -26,7 +26,7 @@ task("task:deployGateway") task("task:deployACL").setAction(async function (taskArguments: TaskArguments, { ethers }) { const deployer = (await ethers.getSigners())[9]; - const factory = await ethers.getContractFactory("ACL"); + const factory = await ethers.getContractFactory("fhevm/lib/ACL.sol:ACL"); const envConfigExec = dotenv.parse(fs.readFileSync("node_modules/fhevm/lib/.env.exec")); const acl = await factory.connect(deployer).deploy(envConfigExec.TFHE_EXECUTOR_CONTRACT_ADDRESS); await acl.waitForDeployment(); @@ -53,7 +53,7 @@ task("task:deployTFHEExecutor").setAction(async function (taskArguments: TaskArg task("task:deployKMSVerifier").setAction(async function (taskArguments: TaskArguments, { ethers }) { const deployer = (await ethers.getSigners())[9]; - const factory = await ethers.getContractFactory("KMSVerifier"); + const factory = await ethers.getContractFactory("fhevm/lib/KMSVerifier.sol:KMSVerifier"); const exec = await factory.connect(deployer).deploy(); await exec.waitForDeployment(); const address = await exec.getAddress(); diff --git a/tasks/taskGatewayRelayer.ts b/tasks/taskGatewayRelayer.ts index d7903af..b97e98c 100644 --- a/tasks/taskGatewayRelayer.ts +++ b/tasks/taskGatewayRelayer.ts @@ -60,7 +60,11 @@ task("task:addRelayer") throw Error(`${taskArguments.gatewayAddress} is not a smart contract`); } const owner = new ethers.Wallet(taskArguments.privateKey).connect(ethers.provider); - const gateway = await ethers.getContractAt("GatewayContract", taskArguments.gatewayAddress, owner); + const gateway = await ethers.getContractAt( + "fhevm/gateway/GatewayContract.sol:GatewayContract", + taskArguments.gatewayAddress, + owner, + ); const tx = await gateway.addRelayer(taskArguments.relayerAddress); const rcpt = await tx.wait(); if (rcpt!.status === 1) { @@ -80,7 +84,11 @@ task("task:removeRelayer") throw Error(`${taskArguments.gatewayAddress} is not a smart contract`); } const owner = new ethers.Wallet(taskArguments.privateKey).connect(ethers.provider); - const gateway = await ethers.getContractAt("GatewayContract", taskArguments.gatewayAddress, owner); + const gateway = await ethers.getContractAt( + "fhevm/gateway/GatewayContract.sol:GatewayContract", + taskArguments.gatewayAddress, + owner, + ); const tx = await gateway.removeRelayer(taskArguments.relayerAddress); const rcpt = await tx.wait(); if (rcpt!.status === 1) { @@ -100,10 +108,18 @@ task("task:launchFhevm") const ownerAddress = new hre.ethers.Wallet(privKeyOwner!).address; const relayerAddress = new hre.ethers.Wallet(privKeyRelayer!).address; if (!taskArgs.skipGetCoin) { - const p1 = getCoin(deployerAddress); - const p2 = getCoin(ownerAddress); - const p3 = getCoin(relayerAddress); - await Promise.all([p1, p2, p3]); + if (hre.network.name === "hardhat") { + const bal = "0x1000000000000000000000000000000000000000"; + const p1 = hre.network.provider.send("hardhat_setBalance", [deployerAddress, bal]); + const p2 = hre.network.provider.send("hardhat_setBalance", [ownerAddress, bal]); + const p3 = hre.network.provider.send("hardhat_setBalance", [relayerAddress, bal]); + await Promise.all([p1, p2, p3]); + } else { + const p1 = getCoin(deployerAddress); + const p2 = getCoin(ownerAddress); + const p3 = getCoin(relayerAddress); + await Promise.all([p1, p2, p3]); + } } await new Promise((res) => setTimeout(res, 5000)); // wait 5 seconds console.log(`privateKey ${privKeyDeployer}`); diff --git a/test/asyncDecrypt.ts b/test/asyncDecrypt.ts index 881411d..5b38cc5 100644 --- a/test/asyncDecrypt.ts +++ b/test/asyncDecrypt.ts @@ -1,11 +1,27 @@ import dotenv from "dotenv"; import fs from "fs"; -import { ethers } from "hardhat"; +import { ethers, network } from "hardhat"; import { GatewayContract } from "../types"; +import { awaitCoprocessor, getClearText } from "./coprocessorUtils"; import { waitNBlocks } from "./utils"; -const network = process.env.HARDHAT_NETWORK; +const networkName = network.name; + +const parsedEnvACL = dotenv.parse(fs.readFileSync("node_modules/fhevm/lib/.env.acl")); +const aclAdd = parsedEnvACL.ACL_CONTRACT_ADDRESS.replace(/^0x/, "").replace(/^0+/, "").toLowerCase(); + +const CiphertextType = { + 0: "bool", + 1: "uint8", // corresponding to euint4 + 2: "uint8", // corresponding to euint8 + 3: "uint16", + 4: "uint32", + 5: "uint64", + 6: "uint128", + 7: "address", + 11: "bytes", +}; const currentTime = (): string => { const now = new Date(); @@ -25,11 +41,19 @@ const ifaceResultCallback = new ethers.Interface(["event ResultCallback" + argEv let gateway: GatewayContract; let firstBlockListening: number; +let lastBlockSnapshotForDecrypt: number; export const asyncDecrypt = async (): Promise => { firstBlockListening = await ethers.provider.getBlockNumber(); + if (networkName === "hardhat" && hre.__SOLIDITY_COVERAGE_RUNNING !== true) { + // evm_snapshot is not supported in coverage mode + await ethers.provider.send("set_lastBlockSnapshotForDecrypt", [firstBlockListening]); + } // this function will emit logs for every request and fulfilment of a decryption - gateway = await ethers.getContractAt("GatewayContract", parsedEnv.GATEWAY_CONTRACT_PREDEPLOY_ADDRESS); + gateway = await ethers.getContractAt( + "fhevm/gateway/GatewayContract.sol:GatewayContract", + parsedEnv.GATEWAY_CONTRACT_PREDEPLOY_ADDRESS, + ); gateway.on( "EventDecryption", async (requestID, cts, contractCaller, callbackSelector, msgValue, maxTimestamp, eventData) => { @@ -44,9 +68,24 @@ export const asyncDecrypt = async (): Promise => { }; export const awaitAllDecryptionResults = async (): Promise => { - gateway = await ethers.getContractAt("GatewayContract", parsedEnv.GATEWAY_CONTRACT_PREDEPLOY_ADDRESS); - await fulfillAllPastRequestsIds(network === "hardhat"); - firstBlockListening = await ethers.provider.getBlockNumber(); + gateway = await ethers.getContractAt( + "fhevm/gateway/GatewayContract.sol:GatewayContract", + parsedEnv.GATEWAY_CONTRACT_PREDEPLOY_ADDRESS, + ); + const provider = ethers.provider; + if (networkName === "hardhat" && hre.__SOLIDITY_COVERAGE_RUNNING !== true) { + // evm_snapshot is not supported in coverage mode + lastBlockSnapshotForDecrypt = await provider.send("get_lastBlockSnapshotForDecrypt"); + if (lastBlockSnapshotForDecrypt < firstBlockListening) { + firstBlockListening = lastBlockSnapshotForDecrypt + 1; + } + } + await fulfillAllPastRequestsIds(networkName === "hardhat"); + firstBlockListening = (await ethers.provider.getBlockNumber()) + 1; + if (networkName === "hardhat" && hre.__SOLIDITY_COVERAGE_RUNNING !== true) { + // evm_snapshot is not supported in coverage mode + await provider.send("set_lastBlockSnapshotForDecrypt", [firstBlockListening]); + } }; const getAlreadyFulfilledDecryptions = async (): Promise<[bigint]> => { @@ -64,6 +103,8 @@ const getAlreadyFulfilledDecryptions = async (): Promise<[bigint]> => { return results; }; +const allTrue = (arr: boolean[], fn = Boolean) => arr.every(fn); + const fulfillAllPastRequestsIds = async (mocked: boolean) => { const eventDecryption = await gateway.filters.EventDecryption().getTopicFilter(); const results = await getAlreadyFulfilledDecryptions(); @@ -77,18 +118,37 @@ const fulfillAllPastRequestsIds = async (mocked: boolean) => { for (const request of pastRequests) { const event = ifaceEventDecryption.parseLog(request); const requestID = event.args[0]; - const cts = event.args[1]; - const handles = cts.map((ct) => ct[0]); - const typesEnum = cts.map((ct) => ct[1]); + const handles = event.args[1]; + const typesList = handles.map((handle) => parseInt(handle.toString(16).slice(-4, -2), 16)); const msgValue = event.args[4]; if (!results.includes(requestID)) { // if request is not already fulfilled if (mocked) { // in mocked mode, we trigger the decryption fulfillment manually - const types = typesEnum.map((num) => CiphertextType[num]); - const values = handles.map((handle, index) => (typesEnum[index] === 7n ? handle.toString(16) : handle)); - const calldata = ethers.AbiCoder.defaultAbiCoder().encode(types, values); - const tx = await gateway.connect(relayer).fulfillRequest(requestID, calldata, { value: msgValue }); + await awaitCoprocessor(); + + // first check tat all handles are allowed for decryption + const aclFactory = await ethers.getContractFactory("fhevm/lib/ACL.sol:ACL"); + const acl = aclFactory.attach(`0x${aclAdd}`); + const isAllowedForDec = await Promise.all(handles.map(async (handle) => acl.allowedForDecryption(handle))); + if (!allTrue(isAllowedForDec)) { + throw new Error("Some handle is not authorized for decryption"); + } + + const types = typesList.map((num) => CiphertextType[num]); + const values = await Promise.all(handles.map(async (handle) => BigInt(await getClearText(handle)))); + const valuesFormatted = values.map((value, index) => + types[index] === "address" ? "0x" + value.toString(16).padStart(40, "0") : value, + ); + const valuesFormatted2 = valuesFormatted.map((value, index) => + types[index] === "bytes" ? "0x" + value.toString(16).padStart(512, "0") : value, + ); + + const abiCoder = new ethers.AbiCoder(); + const encodedData = abiCoder.encode(["uint256", ...types], [31, ...valuesFormatted2]); // 31 is just a dummy uint256 requestID to get correct abi encoding for the remaining arguments (i.e everything except the requestID) + const calldata = "0x" + encodedData.slice(66); // we just pop the dummy requestID to get the correct value to pass for `decryptedCts` + + const tx = await gateway.connect(relayer).fulfillRequest(requestID, calldata, [], { value: msgValue }); await tx.wait(); } else { // in fhEVM mode we must wait until the gateway service relayer submits the decryption fulfillment tx diff --git a/test/coprocessorUtils.ts b/test/coprocessorUtils.ts new file mode 100644 index 0000000..a9c9c9b --- /dev/null +++ b/test/coprocessorUtils.ts @@ -0,0 +1,875 @@ +import dotenv from "dotenv"; +import { log2 } from "extra-bigint"; +import * as fs from "fs"; +import { ethers } from "hardhat"; +import hre from "hardhat"; +import { Database } from "sqlite3"; + +const parsedEnvCoprocessor = dotenv.parse(fs.readFileSync("node_modules/fhevm/lib/.env.exec")); +const coprocAdd = parsedEnvCoprocessor.TFHE_EXECUTOR_CONTRACT_ADDRESS.replace(/^0x/, "") + .replace(/^0+/, "") + .toLowerCase(); + +let firstBlockListening = 0; +let lastBlockSnapshot = 0; +let lastCounterRand = 0; +let counterRand = 0; + +const contractABI = JSON.parse( + fs.readFileSync("abi/TFHEExecutor.json").toString(), +).abi; + +const iface = new ethers.Interface(contractABI); + +const functions = iface.fragments.filter((fragment) => fragment.type === "function"); + +const selectors = functions.reduce((acc, func) => { + const signature = `${func.name}(${func.inputs.map((input) => input.type).join(",")})`; + acc[func.selector] = signature; + return acc; +}, {}); + +//const db = new Database('./sql.db'); // on-disk db for debugging +const db = new Database(":memory:"); + +function insertSQL(handle: string, clearText: BigInt, replace: boolean = false) { + if (replace) { + // this is useful if using snapshots while sampling different random numbers on each revert + db.run("INSERT OR REPLACE INTO ciphertexts (handle, clearText) VALUES (?, ?)", [handle, clearText.toString()]); + } else { + db.run("INSERT OR IGNORE INTO ciphertexts (handle, clearText) VALUES (?, ?)", [handle, clearText.toString()]); + } +} + +// Decrypt any handle, bypassing ACL +// WARNING : only for testing or internal use +export const getClearText = async (handle: BigInt): Promise => { + const handleStr = "0x" + handle.toString(16).padStart(64, "0"); + + return new Promise((resolve, reject) => { + let attempts = 0; + const maxRetries = 10; + + function executeQuery() { + db.get("SELECT clearText FROM ciphertexts WHERE handle = ?", [handleStr], (err, row) => { + if (err) { + reject(new Error(`Error querying database: ${err.message}`)); + } else if (row) { + resolve(row.clearText); + } else if (attempts < maxRetries) { + attempts++; + executeQuery(); + } else { + reject(new Error("No record found after maximum retries")); + } + }); + } + + executeQuery(); + }); +}; +/*export const getClearText = async (handle: BigInt): Promise => { + const handleStr = '0x' + handle.toString(16).padStart(64, '0'); + return new Promise((resolve, reject) => { + db.get('SELECT clearText FROM ciphertexts WHERE handle = ?', [handleStr], (err, row) => { + if (err) { + reject(new Error(`Error querying database: ${err.message}`)); + } else if (row) { + resolve(row.clearText); + } else { + reject(new Error('No record found')); + } + }); + }); +};*/ + +db.serialize(() => db.run("CREATE TABLE IF NOT EXISTS ciphertexts (handle BINARY PRIMARY KEY,clearText TEXT)")); + +enum Operators { + fheAdd = 0, + fheSub, + fheMul, + fheDiv, + fheRem, + fheBitAnd, + fheBitOr, + fheBitXor, + fheShl, + fheShr, + fheRotl, + fheRotr, + fheEq, + fheNe, + fheGe, + fheGt, + fheLe, + fheLt, + fheMin, + fheMax, + fheNeg, + fheNot, + verifyCiphertext, + cast, + trivialEncrypt, + fheIfThenElse, + fheRand, + fheRandBounded, +} + +interface EvmState { + stack: string[]; + memory: string[]; +} + +function extractCalldata(memory: string[], offset: number, size: number): string { + const startIndex = Math.floor(offset / 32); + const endIndex = Math.ceil((offset + size) / 32); + const memorySegments = memory.slice(startIndex, endIndex); + let calldata = ""; + for (let i = 0; i < memorySegments.length; i++) { + calldata += memorySegments[i]; + } + const calldataStart = (offset % 32) * 2; + const calldataEnd = calldataStart + size * 2; + return calldata.slice(calldataStart, calldataEnd); +} + +const TypesBytesSize = { + 0: 1, //ebool + 1: 1, //euint4 + 2: 1, //euint8 + 3: 2, //euint16 + 4: 4, //euint32 + 5: 8, //euint64 + 6: 16, //euint128 + 7: 20, //eaddress + 8: 32, //euint256 + 9: 64, //ebytes64 + 10: 128, //ebytes128 + 11: 256, //ebytes256 +}; + +const NumBits = { + 0: 1n, //ebool + 1: 4n, //euint4 + 2: 8n, //euint8 + 3: 16n, //euint16 + 4: 32n, //euint32 + 5: 64n, //euint64 + 6: 128n, //euint128 + 7: 160n, //eaddress + 8: 256n, //euint256 + 9: 512n, //ebytes64 + 10: 1024n, //ebytes128 + 11: 2048n, //ebytes256 +}; + +const HANDLE_VERSION = 0; + +export function numberToEvenHexString(num: number) { + if (typeof num !== "number" || num < 0) { + throw new Error("Input should be a non-negative number."); + } + let hexString = num.toString(16); + if (hexString.length % 2 !== 0) { + hexString = "0" + hexString; + } + return hexString; +} + +function appendType(handle: string, type: number): string { + return handle.slice(0, -4) + numberToEvenHexString(type) + numberToEvenHexString(HANDLE_VERSION); +} + +function getRandomBigInt(numBits: number): bigint { + if (numBits <= 0) { + throw new Error("Number of bits must be greater than 0"); + } + const numBytes = Math.ceil(numBits / 8); + const randomBytes = new Uint8Array(numBytes); + crypto.getRandomValues(randomBytes); + let randomBigInt = BigInt(0); + for (let i = 0; i < numBytes; i++) { + randomBigInt = (randomBigInt << BigInt(8)) | BigInt(randomBytes[i]); + } + const mask = (BigInt(1) << BigInt(numBits)) - BigInt(1); + randomBigInt = randomBigInt & mask; + return randomBigInt; +} + +async function insertHandle(obj: EvmState, blockNo: number) { + if (isCoprocAdd(obj!.stack.at(-2))) { + const argsOffset = Number(`0x${obj!.stack.at(-4)}`); + const argsSize = Number(`0x${obj!.stack.at(-5)}`); + const calldata = extractCalldata(obj.memory, argsOffset, argsSize); + //console.log('calldata : ', calldata); + const currentSelector = "0x" + calldata.slice(0, 8); + const decodedData = iface.decodeFunctionData(currentSelector, "0x" + calldata); + + let handle; + let clearText; + let clearLHS; + let clearRHS; + let lhsType; + let resultType; + let shift; + + switch (selectors[currentSelector]) { + case "trivialEncrypt(uint256,bytes1)": + resultType = Number(decodedData[1]); + clearText = decodedData[0]; + handle = ethers.keccak256( + ethers.solidityPacked( + ["uint8", "uint256", "bytes1"], + [Operators.trivialEncrypt, decodedData[0], decodedData[1]], + ), + ); + handle = appendType(handle, resultType); + insertSQL(handle, clearText); + break; + + case "fheAdd(uint256,uint256,bytes1)": + handle = ethers.keccak256( + ethers.solidityPacked( + ["uint8", "uint256", "uint256", "bytes1"], + [Operators.fheAdd, decodedData[0], decodedData[1], decodedData[2]], + ), + ); + lhsType = parseInt(decodedData[0].toString(16).slice(-4, -2), 16); + resultType = lhsType; + handle = appendType(handle, resultType); + clearLHS = await getClearText(decodedData[0]); + if (decodedData[2] === "0x01") { + clearText = BigInt(clearLHS) + decodedData[1]; + clearText = clearText % 2n ** NumBits[resultType]; + } else { + clearRHS = await getClearText(decodedData[1]); + clearText = BigInt(clearLHS) + BigInt(clearRHS); + clearText = clearText % 2n ** NumBits[resultType]; + } + insertSQL(handle, clearText); + break; + + case "fheSub(uint256,uint256,bytes1)": + handle = ethers.keccak256( + ethers.solidityPacked( + ["uint8", "uint256", "uint256", "bytes1"], + [Operators.fheSub, decodedData[0], decodedData[1], decodedData[2]], + ), + ); + lhsType = parseInt(decodedData[0].toString(16).slice(-4, -2), 16); + resultType = lhsType; + handle = appendType(handle, resultType); + clearLHS = await getClearText(decodedData[0]); + if (decodedData[2] === "0x01") { + clearText = BigInt(clearLHS) - decodedData[1]; + if (clearText < 0n) clearText = clearText + 2n ** NumBits[resultType]; + clearText = clearText % 2n ** NumBits[resultType]; + } else { + clearRHS = await getClearText(decodedData[1]); + clearText = BigInt(clearLHS) - BigInt(clearRHS); + if (clearText < 0n) clearText = clearText + 2n ** NumBits[resultType]; + clearText = clearText % 2n ** NumBits[resultType]; + } + insertSQL(handle, clearText); + break; + + case "fheMul(uint256,uint256,bytes1)": + handle = ethers.keccak256( + ethers.solidityPacked( + ["uint8", "uint256", "uint256", "bytes1"], + [Operators.fheMul, decodedData[0], decodedData[1], decodedData[2]], + ), + ); + lhsType = parseInt(decodedData[0].toString(16).slice(-4, -2), 16); + resultType = lhsType; + handle = appendType(handle, resultType); + clearLHS = await getClearText(decodedData[0]); + if (decodedData[2] === "0x01") { + clearText = BigInt(clearLHS) * decodedData[1]; + clearText = clearText % 2n ** NumBits[resultType]; + } else { + clearRHS = await getClearText(decodedData[1]); + clearText = BigInt(clearLHS) * BigInt(clearRHS); + clearText = clearText % 2n ** NumBits[resultType]; + } + insertSQL(handle, clearText); + break; + + case "fheDiv(uint256,uint256,bytes1)": + handle = ethers.keccak256( + ethers.solidityPacked( + ["uint8", "uint256", "uint256", "bytes1"], + [Operators.fheDiv, decodedData[0], decodedData[1], decodedData[2]], + ), + ); + lhsType = parseInt(decodedData[0].toString(16).slice(-4, -2), 16); + resultType = lhsType; + handle = appendType(handle, resultType); + clearLHS = await getClearText(decodedData[0]); + if (decodedData[2] === "0x01") { + clearText = BigInt(clearLHS) / decodedData[1]; + } else { + throw new Error("Non-scalar div not implemented yet"); + } + insertSQL(handle, clearText); + break; + + case "fheRem(uint256,uint256,bytes1)": + handle = ethers.keccak256( + ethers.solidityPacked( + ["uint8", "uint256", "uint256", "bytes1"], + [Operators.fheRem, decodedData[0], decodedData[1], decodedData[2]], + ), + ); + lhsType = parseInt(decodedData[0].toString(16).slice(-4, -2), 16); + resultType = lhsType; + handle = appendType(handle, resultType); + clearLHS = await getClearText(decodedData[0]); + if (decodedData[2] === "0x01") { + clearText = BigInt(clearLHS) % decodedData[1]; + } else { + throw new Error("Non-scalar rem not implemented yet"); + } + insertSQL(handle, clearText); + break; + + case "fheBitAnd(uint256,uint256,bytes1)": + handle = ethers.keccak256( + ethers.solidityPacked( + ["uint8", "uint256", "uint256", "bytes1"], + [Operators.fheBitAnd, decodedData[0], decodedData[1], decodedData[2]], + ), + ); + lhsType = parseInt(decodedData[0].toString(16).slice(-4, -2), 16); + resultType = lhsType; + handle = appendType(handle, resultType); + clearLHS = await getClearText(decodedData[0]); + if (decodedData[2] === "0x01") { + clearText = BigInt(clearLHS) & decodedData[1]; + clearText = clearText % 2n ** NumBits[resultType]; + } else { + clearRHS = await getClearText(decodedData[1]); + clearText = BigInt(clearLHS) & BigInt(clearRHS); + clearText = clearText % 2n ** NumBits[resultType]; + } + insertSQL(handle, clearText); + break; + + case "fheBitOr(uint256,uint256,bytes1)": + handle = ethers.keccak256( + ethers.solidityPacked( + ["uint8", "uint256", "uint256", "bytes1"], + [Operators.fheBitOr, decodedData[0], decodedData[1], decodedData[2]], + ), + ); + lhsType = parseInt(decodedData[0].toString(16).slice(-4, -2), 16); + resultType = lhsType; + handle = appendType(handle, resultType); + clearLHS = await getClearText(decodedData[0]); + if (decodedData[2] === "0x01") { + clearText = BigInt(clearLHS) | decodedData[1]; + clearText = clearText % 2n ** NumBits[resultType]; + } else { + clearRHS = await getClearText(decodedData[1]); + clearText = BigInt(clearLHS) | BigInt(clearRHS); + clearText = clearText % 2n ** NumBits[resultType]; + } + insertSQL(handle, clearText); + break; + + case "fheBitXor(uint256,uint256,bytes1)": + handle = ethers.keccak256( + ethers.solidityPacked( + ["uint8", "uint256", "uint256", "bytes1"], + [Operators.fheBitXor, decodedData[0], decodedData[1], decodedData[2]], + ), + ); + lhsType = parseInt(decodedData[0].toString(16).slice(-4, -2), 16); + resultType = lhsType; + handle = appendType(handle, resultType); + clearLHS = await getClearText(decodedData[0]); + if (decodedData[2] === "0x01") { + clearText = BigInt(clearLHS) ^ decodedData[1]; + clearText = clearText % 2n ** NumBits[resultType]; + } else { + clearRHS = await getClearText(decodedData[1]); + clearText = BigInt(clearLHS) ^ BigInt(clearRHS); + clearText = clearText % 2n ** NumBits[resultType]; + } + insertSQL(handle, clearText); + break; + + case "fheShl(uint256,uint256,bytes1)": + handle = ethers.keccak256( + ethers.solidityPacked( + ["uint8", "uint256", "uint256", "bytes1"], + [Operators.fheShl, decodedData[0], decodedData[1], decodedData[2]], + ), + ); + lhsType = parseInt(decodedData[0].toString(16).slice(-4, -2), 16); + resultType = lhsType; + handle = appendType(handle, resultType); + clearLHS = await getClearText(decodedData[0]); + if (decodedData[2] === "0x01") { + clearText = BigInt(clearLHS) << decodedData[1] % NumBits[resultType]; + clearText = clearText % 2n ** NumBits[resultType]; + } else { + clearRHS = await getClearText(decodedData[1]); + clearText = BigInt(clearLHS) << BigInt(clearRHS) % NumBits[resultType]; + clearText = clearText % 2n ** NumBits[resultType]; + } + insertSQL(handle, clearText); + break; + + case "fheShr(uint256,uint256,bytes1)": + handle = ethers.keccak256( + ethers.solidityPacked( + ["uint8", "uint256", "uint256", "bytes1"], + [Operators.fheShr, decodedData[0], decodedData[1], decodedData[2]], + ), + ); + lhsType = parseInt(decodedData[0].toString(16).slice(-4, -2), 16); + resultType = lhsType; + handle = appendType(handle, resultType); + clearLHS = await getClearText(decodedData[0]); + if (decodedData[2] === "0x01") { + clearText = BigInt(clearLHS) >> decodedData[1] % NumBits[resultType]; + clearText = clearText % 2n ** NumBits[resultType]; + } else { + clearRHS = await getClearText(decodedData[1]); + clearText = BigInt(clearLHS) >> BigInt(clearRHS) % NumBits[resultType]; + clearText = clearText % 2n ** NumBits[resultType]; + } + insertSQL(handle, clearText); + break; + + case "fheRotl(uint256,uint256,bytes1)": + handle = ethers.keccak256( + ethers.solidityPacked( + ["uint8", "uint256", "uint256", "bytes1"], + [Operators.fheRotl, decodedData[0], decodedData[1], decodedData[2]], + ), + ); + lhsType = parseInt(decodedData[0].toString(16).slice(-4, -2), 16); + resultType = lhsType; + handle = appendType(handle, resultType); + clearLHS = await getClearText(decodedData[0]); + + if (decodedData[2] === "0x01") { + shift = decodedData[1] % NumBits[resultType]; + clearText = (BigInt(clearLHS) << shift) | (BigInt(clearLHS) >> (NumBits[resultType] - shift)); + clearText = clearText % 2n ** NumBits[resultType]; + } else { + clearRHS = await getClearText(decodedData[1]); + shift = BigInt(clearRHS) % NumBits[resultType]; + clearText = (BigInt(clearLHS) << shift) | (BigInt(clearLHS) >> (NumBits[resultType] - shift)); + clearText = clearText % 2n ** NumBits[resultType]; + } + insertSQL(handle, clearText); + break; + + case "fheRotr(uint256,uint256,bytes1)": + handle = ethers.keccak256( + ethers.solidityPacked( + ["uint8", "uint256", "uint256", "bytes1"], + [Operators.fheRotr, decodedData[0], decodedData[1], decodedData[2]], + ), + ); + lhsType = parseInt(decodedData[0].toString(16).slice(-4, -2), 16); + resultType = lhsType; + handle = appendType(handle, resultType); + clearLHS = await getClearText(decodedData[0]); + + if (decodedData[2] === "0x01") { + shift = decodedData[1] % NumBits[resultType]; + clearText = (BigInt(clearLHS) >> shift) | (BigInt(clearLHS) << (NumBits[resultType] - shift)); + clearText = clearText % 2n ** NumBits[resultType]; + } else { + clearRHS = await getClearText(decodedData[1]); + shift = BigInt(clearRHS) % NumBits[resultType]; + clearText = (BigInt(clearLHS) >> shift) | (BigInt(clearLHS) << (NumBits[resultType] - shift)); + clearText = clearText % 2n ** NumBits[resultType]; + } + insertSQL(handle, clearText); + break; + + case "fheEq(uint256,uint256,bytes1)": + handle = ethers.keccak256( + ethers.solidityPacked( + ["uint8", "uint256", "uint256", "bytes1"], + [Operators.fheEq, decodedData[0], decodedData[1], decodedData[2]], + ), + ); + handle = appendType(handle, 0); + clearLHS = await getClearText(decodedData[0]); + if (decodedData[2] === "0x01") { + clearText = BigInt(clearLHS) === decodedData[1] ? 1n : 0n; + } else { + clearRHS = await getClearText(decodedData[1]); + clearText = BigInt(clearLHS) === BigInt(clearRHS) ? 1n : 0n; + } + insertSQL(handle, clearText); + break; + + case "fheNe(uint256,uint256,bytes1)": + handle = ethers.keccak256( + ethers.solidityPacked( + ["uint8", "uint256", "uint256", "bytes1"], + [Operators.fheNe, decodedData[0], decodedData[1], decodedData[2]], + ), + ); + handle = appendType(handle, 0); + clearLHS = await getClearText(decodedData[0]); + if (decodedData[2] === "0x01") { + clearText = BigInt(clearLHS) !== decodedData[1] ? 1n : 0n; + } else { + clearRHS = await getClearText(decodedData[1]); + clearText = BigInt(clearLHS) !== BigInt(clearRHS) ? 1n : 0n; + } + insertSQL(handle, clearText); + break; + + case "fheGe(uint256,uint256,bytes1)": + handle = ethers.keccak256( + ethers.solidityPacked( + ["uint8", "uint256", "uint256", "bytes1"], + [Operators.fheGe, decodedData[0], decodedData[1], decodedData[2]], + ), + ); + handle = appendType(handle, 0); + clearLHS = await getClearText(decodedData[0]); + if (decodedData[2] === "0x01") { + clearText = BigInt(clearLHS) >= decodedData[1] ? 1n : 0n; + } else { + clearRHS = await getClearText(decodedData[1]); + clearText = BigInt(clearLHS) >= BigInt(clearRHS) ? 1n : 0n; + } + insertSQL(handle, clearText); + break; + + case "fheGt(uint256,uint256,bytes1)": + handle = ethers.keccak256( + ethers.solidityPacked( + ["uint8", "uint256", "uint256", "bytes1"], + [Operators.fheGt, decodedData[0], decodedData[1], decodedData[2]], + ), + ); + handle = appendType(handle, 0); + clearLHS = await getClearText(decodedData[0]); + if (decodedData[2] === "0x01") { + clearText = BigInt(clearLHS) > decodedData[1] ? 1n : 0n; + } else { + clearRHS = await getClearText(decodedData[1]); + clearText = BigInt(clearLHS) > BigInt(clearRHS) ? 1n : 0n; + } + insertSQL(handle, clearText); + break; + + case "fheLe(uint256,uint256,bytes1)": + handle = ethers.keccak256( + ethers.solidityPacked( + ["uint8", "uint256", "uint256", "bytes1"], + [Operators.fheLe, decodedData[0], decodedData[1], decodedData[2]], + ), + ); + handle = appendType(handle, 0); + clearLHS = await getClearText(decodedData[0]); + if (decodedData[2] === "0x01") { + clearText = BigInt(clearLHS) <= decodedData[1] ? 1n : 0n; + } else { + clearRHS = await getClearText(decodedData[1]); + clearText = BigInt(clearLHS) <= BigInt(clearRHS) ? 1n : 0n; + } + insertSQL(handle, clearText); + break; + + case "fheLt(uint256,uint256,bytes1)": + handle = ethers.keccak256( + ethers.solidityPacked( + ["uint8", "uint256", "uint256", "bytes1"], + [Operators.fheLt, decodedData[0], decodedData[1], decodedData[2]], + ), + ); + handle = appendType(handle, 0); + clearLHS = await getClearText(decodedData[0]); + if (decodedData[2] === "0x01") { + clearText = BigInt(clearLHS) < decodedData[1] ? 1n : 0n; + } else { + clearRHS = await getClearText(decodedData[1]); + clearText = BigInt(clearLHS) < BigInt(clearRHS) ? 1n : 0n; + } + insertSQL(handle, clearText); + break; + + case "fheMax(uint256,uint256,bytes1)": + lhsType = parseInt(decodedData[0].toString(16).slice(-4, -2), 16); + resultType = lhsType; + handle = ethers.keccak256( + ethers.solidityPacked( + ["uint8", "uint256", "uint256", "bytes1"], + [Operators.fheMax, decodedData[0], decodedData[1], decodedData[2]], + ), + ); + handle = appendType(handle, resultType); + clearLHS = await getClearText(decodedData[0]); + if (decodedData[2] === "0x01") { + clearText = BigInt(clearLHS) > decodedData[1] ? clearLHS : decodedData[1]; + } else { + clearRHS = await getClearText(decodedData[1]); + clearText = BigInt(clearLHS) > BigInt(clearRHS) ? clearLHS : clearRHS; + } + insertSQL(handle, clearText); + break; + + case "fheMin(uint256,uint256,bytes1)": + lhsType = parseInt(decodedData[0].toString(16).slice(-4, -2), 16); + resultType = lhsType; + handle = ethers.keccak256( + ethers.solidityPacked( + ["uint8", "uint256", "uint256", "bytes1"], + [Operators.fheMin, decodedData[0], decodedData[1], decodedData[2]], + ), + ); + handle = appendType(handle, resultType); + clearLHS = await getClearText(decodedData[0]); + if (decodedData[2] === "0x01") { + clearText = BigInt(clearLHS) < decodedData[1] ? clearLHS : decodedData[1]; + } else { + clearRHS = await getClearText(decodedData[1]); + clearText = BigInt(clearLHS) < BigInt(clearRHS) ? clearLHS : clearRHS; + } + insertSQL(handle, clearText); + break; + + case "cast(uint256,bytes1)": + resultType = parseInt(decodedData[1]); + handle = ethers.keccak256( + ethers.solidityPacked(["uint8", "uint256", "bytes1"], [Operators.cast, decodedData[0], decodedData[1]]), + ); + clearText = BigInt(await getClearText(decodedData[0])) % 2n ** NumBits[resultType]; + handle = appendType(handle, resultType); + insertSQL(handle, clearText); + break; + + case "fheNot(uint256)": + resultType = parseInt(decodedData[0].toString(16).slice(-4, -2), 16); + handle = ethers.keccak256(ethers.solidityPacked(["uint8", "uint256"], [Operators.fheNot, decodedData[0]])); + handle = appendType(handle, resultType); + clearText = BigInt(await getClearText(decodedData[0])); + clearText = bitwiseNotUintBits(clearText, Number(NumBits[resultType])); + insertSQL(handle, clearText); + break; + + case "fheNeg(uint256)": + resultType = parseInt(decodedData[0].toString(16).slice(-4, -2), 16); + handle = ethers.keccak256(ethers.solidityPacked(["uint8", "uint256"], [Operators.fheNeg, decodedData[0]])); + handle = appendType(handle, resultType); + clearText = BigInt(await getClearText(decodedData[0])); + clearText = bitwiseNotUintBits(clearText, Number(NumBits[resultType])); + clearText = (clearText + 1n) % 2n ** NumBits[resultType]; + insertSQL(handle, clearText); + break; + + case "verifyCiphertext(bytes32,address,bytes,bytes1)": + handle = decodedData[0]; + const type = parseInt(handle.slice(-4, -2), 16); + if (type !== 11) { + //not an ebytes256 + const typeSize = TypesBytesSize[type]; + const idx = parseInt(handle.slice(-6, -4), 16); + const inputProof = decodedData[2].replace(/^0x/, ""); + clearText = BigInt("0x" + inputProof.slice(2 + 2 * 53 * idx, 2 + 2 * typeSize + 2 * 53 * idx)); + insertSQL(handle, clearText); + } else { + const inputProof = decodedData[2].replace(/^0x/, ""); + clearText = BigInt("0x" + inputProof.slice(2, 2 + 2 * 256)); + insertSQL(handle, clearText); + } + break; + + case "fheIfThenElse(uint256,uint256,uint256)": + resultType = parseInt(decodedData[1].toString(16).slice(-4, -2), 16); + handle = ethers.keccak256( + ethers.solidityPacked( + ["uint8", "uint256", "uint256", "uint256"], + [Operators.fheIfThenElse, decodedData[0], decodedData[1], decodedData[2]], + ), + ); + handle = appendType(handle, resultType); + const clearControl = BigInt(await getClearText(decodedData[0])); + const clearIfTrue = BigInt(await getClearText(decodedData[1])); + const clearIfFalse = BigInt(await getClearText(decodedData[2])); + if (clearControl === 1n) { + clearText = clearIfTrue; + } else { + clearText = clearIfFalse; + } + insertSQL(handle, clearText); + break; + + case "fheRand(bytes1)": + resultType = parseInt(decodedData[0], 16); + handle = ethers.keccak256( + ethers.solidityPacked(["uint8", "bytes1", "uint256"], [Operators.fheRand, decodedData[0], counterRand]), + ); + handle = appendType(handle, resultType); + clearText = getRandomBigInt(Number(NumBits[resultType])); + insertSQL(handle, clearText, true); + counterRand++; + break; + + case "fheRandBounded(uint256,bytes1)": + resultType = parseInt(decodedData[1], 16); + handle = ethers.keccak256( + ethers.solidityPacked( + ["uint8", "uint256", "bytes1", "uint256"], + [Operators.fheRandBounded, decodedData[0], decodedData[1], counterRand], + ), + ); + handle = appendType(handle, resultType); + clearText = getRandomBigInt(Number(log2(BigInt(decodedData[0])))); + insertSQL(handle, clearText, true); + counterRand++; + break; + } + } +} + +function bitwiseNotUintBits(value: BigInt, numBits: number) { + if (typeof value !== "bigint") { + throw new TypeError("The input value must be a BigInt."); + } + if (typeof numBits !== "number" || numBits <= 0) { + throw new TypeError("The numBits parameter must be a positive integer."); + } + + // Create the mask with numBits bits set to 1 + const BIT_MASK = (BigInt(1) << BigInt(numBits)) - BigInt(1); + + return ~value & BIT_MASK; +} + +function isCoprocAdd(longString: string): boolean { + const strippedLongString = longString.replace(/^0+/, ""); + const normalizedLongString = strippedLongString.toLowerCase(); + return normalizedLongString === coprocAdd; +} + +async function processLogs(trace, blockNo) { + for (const obj of trace.structLogs.filter((obj) => obj.op === "CALL")) { + await insertHandle(obj, blockNo); + } +} + +export const awaitCoprocessor = async (): Promise => { + const pastTxHashes = await getAllPastTransactionHashes(); + for (const txHash of pastTxHashes) { + const trace = await ethers.provider.send("debug_traceTransaction", [txHash[0]]); + + if (!trace.failed) { + await processLogs(trace, txHash[1]); + } + } +}; + +async function getAllPastTransactionHashes() { + const provider = ethers.provider; + const latestBlockNumber = await provider.getBlockNumber(); + let txHashes: [string, number][] = []; + + if (hre.__SOLIDITY_COVERAGE_RUNNING !== true) { + // evm_snapshot is not supported in coverage mode + [lastBlockSnapshot, lastCounterRand] = await provider.send("get_lastBlockSnapshot"); + if (lastBlockSnapshot < firstBlockListening) { + firstBlockListening = lastBlockSnapshot + 1; + counterRand = Number(lastCounterRand); + } + } + + // Iterate through all blocks and collect transaction hashes + for (let i = firstBlockListening; i <= latestBlockNumber; i++) { + const block = await provider.getBlock(i); + block!.transactions.forEach((tx) => { + txHashes.push([tx, i]); + }); + } + firstBlockListening = latestBlockNumber + 1; + if (hre.__SOLIDITY_COVERAGE_RUNNING !== true) { + // evm_snapshot is not supported in coverage mode + await provider.send("set_lastBlockSnapshot", [firstBlockListening]); + } + return txHashes; +} + +async function buildCallTree(receipt) { + const txHash = receipt.hash; + const trace = await ethers.provider.send("debug_traceTransaction", [txHash, {}]); + const structLogs = trace.structLogs; + + const callStack = []; + const callTree = { + id: 0, + type: !!receipt.to ? "TOPCALL" : "TOPCREATE", + revert: receipt.status === 1 ? false : true, + to: !!receipt.to ? receipt.to : null, + calls: [], + }; + let currentNode = callTree; + const lenStructLogs = structLogs.length; + let index = 1; + for (const [i, log] of structLogs.entries()) { + if (i < lenStructLogs - 1) { + if (structLogs[i].depth - structLogs[i + 1].depth === 1) { + if (!["RETURN", "SELFDESTRUCT", "STOP", "REVERT", "INVALID"].includes(structLogs[i].op)) { + currentNode.outofgasOrOther = true; + currentNode = callStack.pop(); + } + } + } + + switch (log.op) { + case "CALL": + case "DELEGATECALL": + case "CALLCODE": + case "STATICCALL": + case "CREATE": + case "CREATE2": + if (i < lenStructLogs - 1) { + if (structLogs[i + 1].depth - structLogs[i].depth === 1) { + const newNode = { + id: index, + type: log.op, + to: log.stack[log.stack.length - 2], + calls: [], + revert: true, + outofgasOrOther: false, + }; + currentNode.calls.push(newNode); + callStack.push(currentNode); + currentNode = newNode; + index += 1; + } + } + break; + case "RETURN": // some edge case probably not handled well : if memory expansion cost on RETURN exceeds the remaining gas in current subcall, but it's OK for a mocked mode + case "SELFDESTRUCT": // some edge case probably not handled well : if there is not enough gas remaining on SELFDESTRUCT, but it's OK for a mocked mode + case "STOP": + currentNode.revert = false; + currentNode = callStack.pop(); + break; + case "REVERT": + case "INVALID": + currentNode = callStack.pop(); + break; + } + + switch (log.op) { + case "CREATE": + case "CREATE2": + currentNode.to = null; + break; + } + } + return callTree; +} diff --git a/test/fhevmjsMocked.ts b/test/fhevmjsMocked.ts new file mode 100644 index 0000000..b1b035a --- /dev/null +++ b/test/fhevmjsMocked.ts @@ -0,0 +1,303 @@ +import { toBigIntLE } from "bigint-buffer"; +import { toBufferBE } from "bigint-buffer"; +import crypto from "crypto"; +import dotenv from "dotenv"; +import { ethers } from "ethers"; +import * as fs from "fs"; +import { Keccak } from "sha3"; +import { isAddress } from "web3-validator"; + +import { awaitCoprocessor, getClearText } from "./coprocessorUtils"; + +const hre = require("hardhat"); + +const parsedEnvACL = dotenv.parse(fs.readFileSync("node_modules/fhevm/lib/.env.acl")); +const aclAdd = parsedEnvACL.ACL_CONTRACT_ADDRESS.replace(/^0x/, "").replace(/^0+/, "").toLowerCase(); + +enum Types { + ebool = 0, + euint4, + euint8, + euint16, + euint32, + euint64, + euint128, + eaddress, + euint256, + ebytes64, + ebytes128, + ebytes256, +} + +function bytesToBigInt(byteArray: Uint8Array): bigint { + if (!byteArray || byteArray?.length === 0) { + return BigInt(0); + } + const buffer = Buffer.from(byteArray); + const result = toBigIntLE(buffer); + return result; +} + +function createUintToUint8ArrayFunction(numBits: number) { + const numBytes = Math.ceil(numBits / 8); + return function (uint: number | bigint | boolean) { + const buffer = toBufferBE(BigInt(uint), numBytes); + + // concatenate 32 random bytes at the end of buffer to simulate encryption noise + const randomBytes = crypto.randomBytes(32); + const combinedBuffer = Buffer.concat([buffer, randomBytes]); + + let byteBuffer; + let totalBuffer; + const padBuffer = numBytes <= 20 ? Buffer.alloc(20 - numBytes) : Buffer.alloc(0); // to fit it in an E160List + + switch (numBits) { + case 1: + byteBuffer = Buffer.from([Types.ebool]); + totalBuffer = Buffer.concat([byteBuffer, combinedBuffer, padBuffer]); + break; + case 4: + byteBuffer = Buffer.from([Types.euint4]); + totalBuffer = Buffer.concat([byteBuffer, combinedBuffer, padBuffer]); + break; + case 8: + byteBuffer = Buffer.from([Types.euint8]); + totalBuffer = Buffer.concat([byteBuffer, combinedBuffer, padBuffer]); + break; + case 16: + byteBuffer = Buffer.from([Types.euint16]); + totalBuffer = Buffer.concat([byteBuffer, combinedBuffer, padBuffer]); + break; + case 32: + byteBuffer = Buffer.from([Types.euint32]); + totalBuffer = Buffer.concat([byteBuffer, combinedBuffer, padBuffer]); + break; + case 64: + byteBuffer = Buffer.from([Types.euint64]); + totalBuffer = Buffer.concat([byteBuffer, combinedBuffer, padBuffer]); + break; + case 160: + byteBuffer = Buffer.from([Types.eaddress]); + totalBuffer = Buffer.concat([byteBuffer, combinedBuffer]); + break; + case 2048: + byteBuffer = Buffer.from([Types.ebytes256]); + totalBuffer = Buffer.concat([byteBuffer, combinedBuffer]); + break; + default: + throw Error("Non-supported numBits"); + } + + return totalBuffer; + }; +} + +export const reencryptRequestMocked = async ( + handle: bigint, + privateKey: string, + publicKey: string, + signature: string, + contractAddress: string, + userAddress: string, +) => { + // Signature checking: + const domain = { + name: "Authorization token", + version: "1", + chainId: hre.network.config.chainId, + verifyingContract: contractAddress, + }; + const types = { + Reencrypt: [{ name: "publicKey", type: "bytes" }], + }; + const value = { + publicKey: `0x${publicKey}`, + }; + const signerAddress = ethers.verifyTypedData(domain, types, value, `0x${signature}`); + const normalizedSignerAddress = ethers.getAddress(signerAddress); + const normalizedUserAddress = ethers.getAddress(userAddress); + if (normalizedSignerAddress !== normalizedUserAddress) { + throw new Error("Invalid EIP-712 signature!"); + } + + // ACL checking + const aclFactory = await hre.ethers.getContractFactory("fhevm/lib/ACL.sol:ACL"); + const acl = aclFactory.attach(`0x${aclAdd}`); + const userAllowed = await acl.persistAllowed(handle, userAddress); + const contractAllowed = await acl.persistAllowed(handle, contractAddress); + const isAllowed = userAllowed && contractAllowed; + if (!isAllowed) { + throw new Error("User is not authorized to reencrypt this handle!"); + } + await awaitCoprocessor(); + return BigInt(await getClearText(handle)); +}; + +export const createEncryptedInputMocked = (contractAddress: string, callerAddress: string) => { + if (!isAddress(contractAddress)) { + throw new Error("Contract address is not a valid address."); + } + + if (!isAddress(callerAddress)) { + throw new Error("User address is not a valid address."); + } + + const values: bigint[] = []; + const bits: (keyof typeof ENCRYPTION_TYPES)[] = []; + return { + addBool(value: boolean | number | bigint) { + if (value == null) throw new Error("Missing value"); + if (typeof value !== "boolean" && typeof value !== "number" && typeof value !== "bigint") + throw new Error("The value must be a boolean, a number or a bigint."); + if ((typeof value !== "bigint" || typeof value !== "number") && Number(value) > 1) + throw new Error("The value must be 1 or 0."); + values.push(BigInt(value)); + bits.push(1); + return this; + }, + add4(value: number | bigint) { + checkEncryptedValue(value, 4); + values.push(BigInt(value)); + bits.push(4); + return this; + }, + add8(value: number | bigint) { + checkEncryptedValue(value, 8); + values.push(BigInt(value)); + bits.push(8); + return this; + }, + add16(value: number | bigint) { + checkEncryptedValue(value, 16); + values.push(BigInt(value)); + bits.push(16); + return this; + }, + add32(value: number | bigint) { + checkEncryptedValue(value, 32); + values.push(BigInt(value)); + bits.push(32); + return this; + }, + add64(value: number | bigint) { + checkEncryptedValue(value, 64); + values.push(BigInt(value)); + bits.push(64); + return this; + }, + add128(value: number | bigint) { + checkEncryptedValue(value, 128); + values.push(BigInt(value)); + bits.push(128); + return this; + }, + addAddress(value: string) { + if (!isAddress(value)) { + throw new Error("The value must be a valid address."); + } + values.push(BigInt(value)); + bits.push(160); + return this; + }, + addBytes256(value: Uint8Array) { + const bigIntValue = bytesToBigInt(value); + checkEncryptedValue(bigIntValue, 2048); + values.push(bigIntValue); + bits.push(2048); + return this; + }, + getValues() { + return values; + }, + getBits() { + return bits; + }, + resetValues() { + values.length = 0; + bits.length = 0; + return this; + }, + encrypt() { + const listType = getListType(bits); + + let encrypted = Buffer.alloc(0); + + switch (listType) { + case 160: { + bits.map((v, i) => { + encrypted = Buffer.concat([encrypted, createUintToUint8ArrayFunction(v)(values[i])]); + }); + break; + } + case 2048: { + encrypted = createUintToUint8ArrayFunction(2048)(values[0]); + break; + } + } + + const inputProof = new Uint8Array(encrypted); + const hash = new Keccak(256).update(Buffer.from(inputProof)).digest(); + + const handles = bits.map((v, i) => { + const dataWithIndex = new Uint8Array(hash.length + 1); + dataWithIndex.set(hash, 0); + dataWithIndex.set([i], hash.length); + const finalHash = new Keccak(256).update(Buffer.from(dataWithIndex)).digest(); + const dataInput = new Uint8Array(32); + dataInput.set(finalHash, 0); + dataInput.set([i, ENCRYPTION_TYPES[v], 0], 29); + return dataInput; + }); + return { + handles, + inputProof, + }; + }, + }; +}; + +const checkEncryptedValue = (value: number | bigint, bits: number) => { + if (value == null) throw new Error("Missing value"); + let limit; + if (bits >= 8) { + limit = BigInt(`0x${new Array(bits / 8).fill(null).reduce((v) => `${v}ff`, "")}`); + } else { + limit = BigInt(2 ** bits - 1); + } + if (typeof value !== "number" && typeof value !== "bigint") throw new Error("Value must be a number or a bigint."); + if (value > limit) { + throw new Error(`The value exceeds the limit for ${bits}bits integer (${limit.toString()}).`); + } +}; + +export const ENCRYPTION_TYPES = { + 1: 0, + 4: 1, + 8: 2, + 16: 3, + 32: 4, + 64: 5, + 128: 6, + 160: 7, + 256: 8, + 512: 9, + 1024: 10, + 2048: 11, +}; + +const getListType = (bits: (keyof typeof ENCRYPTION_TYPES)[]) => { + // We limit to 12 items because for now we are using FheUint160List + if (bits.length > 12) { + throw new Error("You can't pack more than 12 values."); + } + + if (bits.reduce((total, v) => total + v, 0) > 2048) { + throw new Error("Too many bits in provided values. Maximum is 2048."); + } + + if (bits.some((v) => v === 2048)) { + return 2048; + } else { + return 160; + } +}; diff --git a/test/gatewayDecrypt/testAsyncDecrypt.ts b/test/gatewayDecrypt/testAsyncDecrypt.ts index 6164b43..c5b4a4d 100644 --- a/test/gatewayDecrypt/testAsyncDecrypt.ts +++ b/test/gatewayDecrypt/testAsyncDecrypt.ts @@ -161,6 +161,38 @@ describe("TestAsyncDecrypt", function () { expect(y).to.equal(ethers.toBeHex(18446744073709550022n, 256)); }); + it("test async decrypt ebytes256 non-trivial with snapshot [skip-on-coverage]", async function () { + if (network.name === "hardhat") { + this.snapshotId = await ethers.provider.send("evm_snapshot"); + const inputAlice = this.instances.alice.createEncryptedInput(this.contractAddress, this.signers.alice.address); + inputAlice.addBytes256(bigIntToBytes(18446744073709550022n)); + const encryptedAmount = inputAlice.encrypt(); + const tx = await await this.contract.requestEbytes256NonTrivial( + encryptedAmount.handles[0], + encryptedAmount.inputProof, + { gasLimit: 5_000_000 }, + ); + await tx.wait(); + await awaitAllDecryptionResults(); + const y = await this.contract.yBytes256(); + expect(y).to.equal(ethers.toBeHex(18446744073709550022n, 256)); + + await ethers.provider.send("evm_revert", [this.snapshotId]); + const inputAlice2 = this.instances.alice.createEncryptedInput(this.contractAddress, this.signers.alice.address); + inputAlice2.addBytes256(bigIntToBytes(424242n)); + const encryptedAmount2 = inputAlice2.encrypt(); + const tx2 = await await this.contract.requestEbytes256NonTrivial( + encryptedAmount2.handles[0], + encryptedAmount2.inputProof, + { gasLimit: 5_000_000 }, + ); + await tx2.wait(); + await awaitAllDecryptionResults(); + const y2 = await this.contract.yBytes256(); + expect(y2).to.equal(ethers.toBeHex(424242n, 256)); + } + }); + it("test async decrypt mixed with ebytes256", async function () { const inputAlice = this.instances.alice.createEncryptedInput(this.contractAddress, this.signers.alice.address); inputAlice.addBytes256(bigIntToBytes(18446744073709550032n)); diff --git a/test/generated.ts b/test/generated.ts deleted file mode 100644 index d8508aa..0000000 --- a/test/generated.ts +++ /dev/null @@ -1,2 +0,0 @@ -export const FHE_LIB_ADDRESS = "0x000000000000000000000000000000000000005d"; -export const OPTIMISTIC_REQUIRES_ENABLED: boolean = true; diff --git a/test/instance.ts b/test/instance.ts index 2c02b0b..4bcc9fb 100644 --- a/test/instance.ts +++ b/test/instance.ts @@ -1,34 +1,50 @@ -import fhevmjs, { clientKeyDecryptor, getCiphertextCallParams, getPublicKeyCallParams } from "fhevmjs"; +import { clientKeyDecryptor, createInstance as createFhevmInstance, getCiphertextCallParams } from "fhevmjs"; import { readFileSync } from "fs"; -import { ethers, ethers as hethers } from "hardhat"; +import { ethers, ethers as hethers, network } from "hardhat"; import { homedir } from "os"; import path from "path"; +import { awaitCoprocessor, getClearText } from "./coprocessorUtils"; +import { createEncryptedInputMocked, reencryptRequestMocked } from "./fhevmjsMocked"; import type { Signers } from "./signers"; import { FhevmInstances } from "./types"; -const hre = require("hardhat"); - -const HARDHAT_NETWORK = process.env.HARDHAT_NETWORK; const FHE_CLIENT_KEY_PATH = process.env.FHE_CLIENT_KEY_PATH; let clientKey: Uint8Array | undefined; +const createInstanceMocked = async () => { + const instance = await createFhevmInstance({ + chainId: network.config.chainId, + }); + instance.reencrypt = reencryptRequestMocked; + instance.createEncryptedInput = createEncryptedInputMocked; + instance.getPublicKey = () => "0xFFAA44433"; + return instance; +}; + export const createInstances = async (accounts: Signers): Promise => { // Create instance const instances: FhevmInstances = {} as FhevmInstances; - await Promise.all( - Object.keys(accounts).map(async (k) => { - instances[k as keyof FhevmInstances] = await createInstance(); - }), - ); - + if (network.name === "hardhat") { + await Promise.all( + Object.keys(accounts).map(async (k) => { + instances[k as keyof FhevmInstances] = await createInstanceMocked(); + }), + ); + } else { + await Promise.all( + Object.keys(accounts).map(async (k) => { + instances[k as keyof FhevmInstances] = await createInstance(); + }), + ); + } return instances; }; export const createInstance = async () => { - const instance = await fhevmjs.createInstance({ - networkUrl: hre.network.config.url, + const instance = await createFhevmInstance({ + networkUrl: network.config.url, gatewayUrl: "http://localhost:7077", }); return instance; @@ -52,29 +68,66 @@ const getDecryptor = () => { }; export const decryptBool = async (handle: bigint): Promise => { - return getDecryptor().decryptBool(await getCiphertext(handle, ethers)); + if (network.name === "hardhat") { + await awaitCoprocessor(); + return (await getClearText(handle)) === "1"; + } else { + return getDecryptor().decryptBool(await getCiphertext(handle, ethers)); + } }; -export const decrypt4 = async (handle: bigint): Promise => { - return getDecryptor().decrypt4(await getCiphertext(handle, ethers)); +export const decrypt4 = async (handle: bigint): Promise => { + if (network.name === "hardhat") { + await awaitCoprocessor(); + return BigInt(await getClearText(handle)); + } else { + return getDecryptor().decrypt4(await getCiphertext(handle, ethers)); + } }; -export const decrypt8 = async (handle: bigint): Promise => { - return getDecryptor().decrypt8(await getCiphertext(handle, ethers)); +export const decrypt8 = async (handle: bigint): Promise => { + if (network.name === "hardhat") { + await awaitCoprocessor(); + return BigInt(await getClearText(handle)); + } else { + return getDecryptor().decrypt8(await getCiphertext(handle, ethers)); + } }; -export const decrypt16 = async (handle: bigint): Promise => { - return getDecryptor().decrypt16(await getCiphertext(handle, ethers)); +export const decrypt16 = async (handle: bigint): Promise => { + if (network.name === "hardhat") { + await awaitCoprocessor(); + return BigInt(await getClearText(handle)); + } else { + return getDecryptor().decrypt16(await getCiphertext(handle, ethers)); + } }; -export const decrypt32 = async (handle: bigint): Promise => { - return getDecryptor().decrypt32(await getCiphertext(handle, ethers)); +export const decrypt32 = async (handle: bigint): Promise => { + if (network.name === "hardhat") { + await awaitCoprocessor(); + return BigInt(await getClearText(handle)); + } else { + return getDecryptor().decrypt32(await getCiphertext(handle, ethers)); + } }; export const decrypt64 = async (handle: bigint): Promise => { - return getDecryptor().decrypt64(await getCiphertext(handle, ethers)); + if (network.name === "hardhat") { + await awaitCoprocessor(); + return BigInt(await getClearText(handle)); + } else { + return getDecryptor().decrypt64(await getCiphertext(handle, ethers)); + } }; export const decryptAddress = async (handle: bigint): Promise => { - return getDecryptor().decryptAddress(await getCiphertext(handle, ethers)); + if (network.name === "hardhat") { + await awaitCoprocessor(); + const bigintAdd = BigInt(await getClearText(handle)); + const handleStr = "0x" + bigintAdd.toString(16).padStart(40, "0"); + return handleStr; + } else { + return getDecryptor().decryptAddress(await getCiphertext(handle, ethers)); + } }; diff --git a/test/utils.ts b/test/utils.ts index b0e5c15..5af310b 100644 --- a/test/utils.ts +++ b/test/utils.ts @@ -1,13 +1,11 @@ import { toBufferLE } from "bigint-buffer"; import { ContractMethodArgs, Typed } from "ethers"; -import { ethers } from "hardhat"; +import { ethers, network } from "hardhat"; -import type { Counter } from "../types"; import { TypedContractMethod } from "../types/common"; -import { getSigners } from "./signers"; export const waitForBlock = (blockNumber: bigint | number) => { - if (process.env.HARDHAT_NETWORK === "hardhat") { + if (network.name === "hardhat") { return new Promise((resolve, reject) => { const intervalId = setInterval(async () => { try { @@ -39,7 +37,7 @@ export const waitForBlock = (blockNumber: bigint | number) => { export const waitNBlocks = async (Nblocks: number) => { const currentBlock = await ethers.provider.getBlockNumber(); - if (process.env.HARDHAT_NETWORK === "hardhat") { + if (network.name === "hardhat") { await produceDummyTransactions(Nblocks); } await waitForBlock(currentBlock + Nblocks); @@ -73,25 +71,20 @@ export const createTransaction = async { - const contract = await deployCounterContract(); let counter = blockCount; - while (counter > 0) { + while (counter >= 0) { counter--; - const tx = await contract.increment(); - const _ = await tx.wait(); + const [signer] = await ethers.getSigners(); + const nullAddress = "0x0000000000000000000000000000000000000000"; + const tx = { + to: nullAddress, + value: 0n, + }; + const receipt = await signer.sendTransaction(tx); + await receipt.wait(); } }; -async function deployCounterContract(): Promise { - const signers = await getSigners(); - - const contractFactory = await ethers.getContractFactory("Counter"); - const contract = await contractFactory.connect(signers.dave).deploy(); - await contract.waitForDeployment(); - - return contract; -} - export const mineNBlocks = async (n: number) => { for (let index = 0; index < n; index++) { await ethers.provider.send("evm_mine"); diff --git a/tf.json b/tf.json new file mode 100644 index 0000000..de1af26 --- /dev/null +++ b/tf.json @@ -0,0 +1,790 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "TFHEExecutor", + "sourceName": "fhevmTemp/fhevm/lib/TFHEExecutor.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "uint256", + "name": "ct", + "type": "uint256" + }, + { + "internalType": "bytes1", + "name": "toType", + "type": "bytes1" + } + ], + "name": "cast", + "outputs": [ + { + "internalType": "uint256", + "name": "result", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "cleanTransientStorage", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "lhs", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "rhs", + "type": "uint256" + }, + { + "internalType": "bytes1", + "name": "scalarByte", + "type": "bytes1" + } + ], + "name": "fheAdd", + "outputs": [ + { + "internalType": "uint256", + "name": "result", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "lhs", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "rhs", + "type": "uint256" + }, + { + "internalType": "bytes1", + "name": "scalarByte", + "type": "bytes1" + } + ], + "name": "fheBitAnd", + "outputs": [ + { + "internalType": "uint256", + "name": "result", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "lhs", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "rhs", + "type": "uint256" + }, + { + "internalType": "bytes1", + "name": "scalarByte", + "type": "bytes1" + } + ], + "name": "fheBitOr", + "outputs": [ + { + "internalType": "uint256", + "name": "result", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "lhs", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "rhs", + "type": "uint256" + }, + { + "internalType": "bytes1", + "name": "scalarByte", + "type": "bytes1" + } + ], + "name": "fheBitXor", + "outputs": [ + { + "internalType": "uint256", + "name": "result", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "lhs", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "rhs", + "type": "uint256" + }, + { + "internalType": "bytes1", + "name": "scalarByte", + "type": "bytes1" + } + ], + "name": "fheDiv", + "outputs": [ + { + "internalType": "uint256", + "name": "result", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "lhs", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "rhs", + "type": "uint256" + }, + { + "internalType": "bytes1", + "name": "scalarByte", + "type": "bytes1" + } + ], + "name": "fheEq", + "outputs": [ + { + "internalType": "uint256", + "name": "result", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "lhs", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "rhs", + "type": "uint256" + }, + { + "internalType": "bytes1", + "name": "scalarByte", + "type": "bytes1" + } + ], + "name": "fheGe", + "outputs": [ + { + "internalType": "uint256", + "name": "result", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "lhs", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "rhs", + "type": "uint256" + }, + { + "internalType": "bytes1", + "name": "scalarByte", + "type": "bytes1" + } + ], + "name": "fheGt", + "outputs": [ + { + "internalType": "uint256", + "name": "result", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "control", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "ifTrue", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "ifFalse", + "type": "uint256" + } + ], + "name": "fheIfThenElse", + "outputs": [ + { + "internalType": "uint256", + "name": "result", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "lhs", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "rhs", + "type": "uint256" + }, + { + "internalType": "bytes1", + "name": "scalarByte", + "type": "bytes1" + } + ], + "name": "fheLe", + "outputs": [ + { + "internalType": "uint256", + "name": "result", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "lhs", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "rhs", + "type": "uint256" + }, + { + "internalType": "bytes1", + "name": "scalarByte", + "type": "bytes1" + } + ], + "name": "fheLt", + "outputs": [ + { + "internalType": "uint256", + "name": "result", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "lhs", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "rhs", + "type": "uint256" + }, + { + "internalType": "bytes1", + "name": "scalarByte", + "type": "bytes1" + } + ], + "name": "fheMax", + "outputs": [ + { + "internalType": "uint256", + "name": "result", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "lhs", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "rhs", + "type": "uint256" + }, + { + "internalType": "bytes1", + "name": "scalarByte", + "type": "bytes1" + } + ], + "name": "fheMin", + "outputs": [ + { + "internalType": "uint256", + "name": "result", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "lhs", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "rhs", + "type": "uint256" + }, + { + "internalType": "bytes1", + "name": "scalarByte", + "type": "bytes1" + } + ], + "name": "fheMul", + "outputs": [ + { + "internalType": "uint256", + "name": "result", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "lhs", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "rhs", + "type": "uint256" + }, + { + "internalType": "bytes1", + "name": "scalarByte", + "type": "bytes1" + } + ], + "name": "fheNe", + "outputs": [ + { + "internalType": "uint256", + "name": "result", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "ct", + "type": "uint256" + } + ], + "name": "fheNeg", + "outputs": [ + { + "internalType": "uint256", + "name": "result", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "ct", + "type": "uint256" + } + ], + "name": "fheNot", + "outputs": [ + { + "internalType": "uint256", + "name": "result", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes1", + "name": "randType", + "type": "bytes1" + } + ], + "name": "fheRand", + "outputs": [ + { + "internalType": "uint256", + "name": "result", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "upperBound", + "type": "uint256" + }, + { + "internalType": "bytes1", + "name": "randType", + "type": "bytes1" + } + ], + "name": "fheRandBounded", + "outputs": [ + { + "internalType": "uint256", + "name": "result", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "lhs", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "rhs", + "type": "uint256" + }, + { + "internalType": "bytes1", + "name": "scalarByte", + "type": "bytes1" + } + ], + "name": "fheRem", + "outputs": [ + { + "internalType": "uint256", + "name": "result", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "lhs", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "rhs", + "type": "uint256" + }, + { + "internalType": "bytes1", + "name": "scalarByte", + "type": "bytes1" + } + ], + "name": "fheRotl", + "outputs": [ + { + "internalType": "uint256", + "name": "result", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "lhs", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "rhs", + "type": "uint256" + }, + { + "internalType": "bytes1", + "name": "scalarByte", + "type": "bytes1" + } + ], + "name": "fheRotr", + "outputs": [ + { + "internalType": "uint256", + "name": "result", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "lhs", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "rhs", + "type": "uint256" + }, + { + "internalType": "bytes1", + "name": "scalarByte", + "type": "bytes1" + } + ], + "name": "fheShl", + "outputs": [ + { + "internalType": "uint256", + "name": "result", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "lhs", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "rhs", + "type": "uint256" + }, + { + "internalType": "bytes1", + "name": "scalarByte", + "type": "bytes1" + } + ], + "name": "fheShr", + "outputs": [ + { + "internalType": "uint256", + "name": "result", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "lhs", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "rhs", + "type": "uint256" + }, + { + "internalType": "bytes1", + "name": "scalarByte", + "type": "bytes1" + } + ], + "name": "fheSub", + "outputs": [ + { + "internalType": "uint256", + "name": "result", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "plaintext", + "type": "uint256" + }, + { + "internalType": "bytes1", + "name": "toType", + "type": "bytes1" + } + ], + "name": "trivialEncrypt", + "outputs": [ + { + "internalType": "uint256", + "name": "result", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "inputHandle", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "callerAddress", + "type": "address" + }, + { + "internalType": "bytes", + "name": "inputProof", + "type": "bytes" + }, + { + "internalType": "bytes1", + "name": "inputType", + "type": "bytes1" + } + ], + "name": "verifyCiphertext", + "outputs": [ + { + "internalType": "uint256", + "name": "result", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "bytecode": "0x608060405234801561000f575f80fd5b506125ba8061001d5f395ff3fe608060405234801561000f575f80fd5b50600436106101c6575f3560e01c8063816d57d3116100fe578063a8b42a891161009e578063ec4057dc1161006e578063ec4057dc146103a6578063eee1833c146103b9578063f953e427146103cc578063fa33b7af146103df575f80fd5b8063a8b42a891461035a578063cb3b94071461036d578063e0c516ae14610380578063e71746b814610393575f80fd5b8063900d294e116100d9578063900d294e1461030e5780639675211f14610321578063a86e9de514610334578063a87deac414610347575f80fd5b8063816d57d3146102d557806389a4314b146102e85780638c14cc21146102fb575f80fd5b806336cdd31b116101695780634be68d20116101445780634be68d2014610289578063666a35881461029c578063694daf72146102af5780636be31758146102c2575f80fd5b806336cdd31b146102505780633e63c50a1461026357806344ae9c5c14610276575f80fd5b806319271081116101a457806319271081146102155780632c7d67b7146102285780632e817ff01461023b57806335334c231461024e575f80fd5b8063052896f1146101ca57806305907343146101ef57806313801ffa14610202575b5f80fd5b6101dd6101d8366004612305565b6103f2565b60405190815260200160405180910390f35b6101dd6101fd366004612305565b6105d7565b6101dd610210366004612337565b610718565b6101dd610223366004612305565b61085a565b6101dd610236366004612305565b61099b565b6101dd610249366004612362565b610acb565b005b6101dd61025e366004612305565b610ba2565b6101dd610271366004612305565b610c59565b6101dd610284366004612305565b610d9a565b6101dd610297366004612451565b610edb565b6101dd6102aa366004612305565b61102e565b6101dd6102bd366004612305565b61115e565b6101dd6102d0366004612305565b61129f565b6101dd6102e3366004612305565b6113e0565b6101dd6102f6366004612305565b611521565b6101dd610309366004612305565b611662565b6101dd61031c36600461247b565b6117a3565b6101dd61032f366004612305565b6117f1565b6101dd610342366004612305565b611932565b6101dd610355366004612305565b611a73565b6101dd610368366004612337565b611bb4565b6101dd61037b36600461249b565b611c54565b6101dd61038e366004612305565b611df4565b6101dd6103a1366004612451565b611eab565b6101dd6103b4366004612305565b611ee2565b6101dd6103c7366004612305565b612012565b6101dd6103da366004612305565b612153565b6101dd6103ed366004612451565b612294565b604051632fd514cd60e11b8152600481018490523360248201525f905f8051602061258e83398151915290635faa299a90604401602060405180830381865afa158015610441573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061046591906124c4565b61046d575f80fd5b6001600160f81b031982165f036104f757604051632fd514cd60e11b8152600481018490523360248201525f8051602061258e83398151915290635faa299a90604401602060405180830381865afa1580156104cb573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104ef91906124c4565b6104f7575f80fd5b60405163052896f160e01b815260048101859052602481018490526001600160f81b031983166044820152605d9063052896f1906064015b602060405180830381865afa15801561054a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061056e91906124e3565b6040516346ce4e4960e11b8152600481018290523360248201529091505f8051602061258e83398151915290638d9c9c92906044015f604051808303815f87803b1580156105ba575f80fd5b505af11580156105cc573d5f803e3d5ffd5b505050509392505050565b604051632fd514cd60e11b8152600481018490523360248201525f905f8051602061258e83398151915290635faa299a90604401602060405180830381865afa158015610626573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061064a91906124c4565b610652575f80fd5b6001600160f81b031982165f036106dc57604051632fd514cd60e11b8152600481018490523360248201525f8051602061258e83398151915290635faa299a90604401602060405180830381865afa1580156106b0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106d491906124c4565b6106dc575f80fd5b604051630590734360e01b815260048101859052602481018490526001600160f81b031983166044820152605d9063059073439060640161052f565b604051632fd514cd60e11b8152600481018290523360248201525f905f8051602061258e83398151915290635faa299a90604401602060405180830381865afa158015610767573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061078b91906124c4565b610793575f80fd5b6040516309c00ffd60e11b815260048101839052605d906313801ffa906024015b602060405180830381865afa1580156107cf573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107f391906124e3565b6040516346ce4e4960e11b8152600481018290523360248201529091505f8051602061258e83398151915290638d9c9c92906044015f604051808303815f87803b15801561083f575f80fd5b505af1158015610851573d5f803e3d5ffd5b50505050919050565b604051632fd514cd60e11b8152600481018490523360248201525f905f8051602061258e83398151915290635faa299a90604401602060405180830381865afa1580156108a9573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108cd91906124c4565b6108d5575f80fd5b6001600160f81b031982165f0361095f57604051632fd514cd60e11b8152600481018490523360248201525f8051602061258e83398151915290635faa299a90604401602060405180830381865afa158015610933573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061095791906124c4565b61095f575f80fd5b604051631927108160e01b815260048101859052602481018490526001600160f81b031983166044820152605d9063192710819060640161052f565b604051632fd514cd60e11b8152600481018490523360248201525f905f8051602061258e83398151915290635faa299a90604401602060405180830381865afa1580156109ea573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a0e91906124c4565b610a16575f80fd5b604051632fd514cd60e11b8152600481018490523360248201525f8051602061258e83398151915290635faa299a90604401602060405180830381865afa158015610a63573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a8791906124c4565b610a8f575f80fd5b604051632c7d67b760e01b815260048101859052602481018490526001600160f81b031983166044820152605d90632c7d67b79060640161052f565b604051633ef43c9560e11b81525f90605d90637de8792a90610af990889088903390899089906004016124fa565b602060405180830381865afa158015610b14573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b3891906124e3565b6040516346ce4e4960e11b8152600481018290523360248201529091505f8051602061258e83398151915290638d9c9c92906044015f604051808303815f87803b158015610b84575f80fd5b505af1158015610b96573d5f803e3d5ffd5b50505050949350505050565b604051632fd514cd60e11b8152600481018490523360248201525f905f8051602061258e83398151915290635faa299a90604401602060405180830381865afa158015610bf1573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c1591906124c4565b610c1d575f80fd5b6040516336cdd31b60e01b815260048101859052602481018490526001600160f81b031983166044820152605d906336cdd31b9060640161052f565b604051632fd514cd60e11b8152600481018490523360248201525f905f8051602061258e83398151915290635faa299a90604401602060405180830381865afa158015610ca8573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ccc91906124c4565b610cd4575f80fd5b6001600160f81b031982165f03610d5e57604051632fd514cd60e11b8152600481018490523360248201525f8051602061258e83398151915290635faa299a90604401602060405180830381865afa158015610d32573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d5691906124c4565b610d5e575f80fd5b604051631f31e28560e11b815260048101859052602481018490526001600160f81b031983166044820152605d90633e63c50a9060640161052f565b604051632fd514cd60e11b8152600481018490523360248201525f905f8051602061258e83398151915290635faa299a90604401602060405180830381865afa158015610de9573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e0d91906124c4565b610e15575f80fd5b6001600160f81b031982165f03610e9f57604051632fd514cd60e11b8152600481018490523360248201525f8051602061258e83398151915290635faa299a90604401602060405180830381865afa158015610e73573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e9791906124c4565b610e9f575f80fd5b60405163112ba71760e21b815260048101859052602481018490526001600160f81b031983166044820152605d906344ae9c5c9060640161052f565b604051632fd514cd60e11b8152600481018390523360248201525f905f8051602061258e83398151915290635faa299a90604401602060405180830381865afa158015610f2a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f4e91906124c4565b610f56575f80fd5b60405163025f346960e51b8152600481018490526001600160f81b031983166024820152605d90634be68d20906044015b602060405180830381865afa158015610fa2573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610fc691906124e3565b6040516346ce4e4960e11b8152600481018290523360248201529091505f8051602061258e83398151915290638d9c9c92906044015f604051808303815f87803b158015611012575f80fd5b505af1158015611024573d5f803e3d5ffd5b5050505092915050565b604051632fd514cd60e11b8152600481018490523360248201525f905f8051602061258e83398151915290635faa299a90604401602060405180830381865afa15801561107d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110a191906124c4565b6110a9575f80fd5b604051632fd514cd60e11b8152600481018490523360248201525f8051602061258e83398151915290635faa299a90604401602060405180830381865afa1580156110f6573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061111a91906124c4565b611122575f80fd5b604051630ccd46b160e31b815260048101859052602481018490526001600160f81b031983166044820152605d9063666a35889060640161052f565b604051632fd514cd60e11b8152600481018490523360248201525f905f8051602061258e83398151915290635faa299a90604401602060405180830381865afa1580156111ad573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111d191906124c4565b6111d9575f80fd5b6001600160f81b031982165f0361126357604051632fd514cd60e11b8152600481018490523360248201525f8051602061258e83398151915290635faa299a90604401602060405180830381865afa158015611237573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061125b91906124c4565b611263575f80fd5b6040516334a6d7b960e11b815260048101859052602481018490526001600160f81b031983166044820152605d9063694daf729060640161052f565b604051632fd514cd60e11b8152600481018490523360248201525f905f8051602061258e83398151915290635faa299a90604401602060405180830381865afa1580156112ee573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061131291906124c4565b61131a575f80fd5b6001600160f81b031982165f036113a457604051632fd514cd60e11b8152600481018490523360248201525f8051602061258e83398151915290635faa299a90604401602060405180830381865afa158015611378573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061139c91906124c4565b6113a4575f80fd5b604051630d7c62eb60e31b815260048101859052602481018490526001600160f81b031983166044820152605d90636be317589060640161052f565b604051632fd514cd60e11b8152600481018490523360248201525f905f8051602061258e83398151915290635faa299a90604401602060405180830381865afa15801561142f573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061145391906124c4565b61145b575f80fd5b6001600160f81b031982165f036114e557604051632fd514cd60e11b8152600481018490523360248201525f8051602061258e83398151915290635faa299a90604401602060405180830381865afa1580156114b9573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114dd91906124c4565b6114e5575f80fd5b60405163816d57d360e01b815260048101859052602481018490526001600160f81b031983166044820152605d9063816d57d39060640161052f565b604051632fd514cd60e11b8152600481018490523360248201525f905f8051602061258e83398151915290635faa299a90604401602060405180830381865afa158015611570573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061159491906124c4565b61159c575f80fd5b6001600160f81b031982165f0361162657604051632fd514cd60e11b8152600481018490523360248201525f8051602061258e83398151915290635faa299a90604401602060405180830381865afa1580156115fa573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061161e91906124c4565b611626575f80fd5b6040516389a4314b60e01b815260048101859052602481018490526001600160f81b031983166044820152605d906389a4314b9060640161052f565b604051632fd514cd60e11b8152600481018490523360248201525f905f8051602061258e83398151915290635faa299a90604401602060405180830381865afa1580156116b1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116d591906124c4565b6116dd575f80fd5b6001600160f81b031982165f0361176757604051632fd514cd60e11b8152600481018490523360248201525f8051602061258e83398151915290635faa299a90604401602060405180830381865afa15801561173b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061175f91906124c4565b611767575f80fd5b604051638c14cc2160e01b815260048101859052602481018490526001600160f81b031983166044820152605d90638c14cc219060640161052f565b604051635966f2b360e01b81526001600160f81b0319821660048201525f6024820181905290605d90635966f2b3906044016020604051808303815f875af11580156107cf573d5f803e3d5ffd5b604051632fd514cd60e11b8152600481018490523360248201525f905f8051602061258e83398151915290635faa299a90604401602060405180830381865afa158015611840573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061186491906124c4565b61186c575f80fd5b6001600160f81b031982165f036118f657604051632fd514cd60e11b8152600481018490523360248201525f8051602061258e83398151915290635faa299a90604401602060405180830381865afa1580156118ca573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118ee91906124c4565b6118f6575f80fd5b604051639675211f60e01b815260048101859052602481018490526001600160f81b031983166044820152605d90639675211f9060640161052f565b604051632fd514cd60e11b8152600481018490523360248201525f905f8051602061258e83398151915290635faa299a90604401602060405180830381865afa158015611981573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119a591906124c4565b6119ad575f80fd5b6001600160f81b031982165f03611a3757604051632fd514cd60e11b8152600481018490523360248201525f8051602061258e83398151915290635faa299a90604401602060405180830381865afa158015611a0b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a2f91906124c4565b611a37575f80fd5b60405163a86e9de560e01b815260048101859052602481018490526001600160f81b031983166044820152605d9063a86e9de59060640161052f565b604051632fd514cd60e11b8152600481018490523360248201525f905f8051602061258e83398151915290635faa299a90604401602060405180830381865afa158015611ac2573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611ae691906124c4565b611aee575f80fd5b6001600160f81b031982165f03611b7857604051632fd514cd60e11b8152600481018490523360248201525f8051602061258e83398151915290635faa299a90604401602060405180830381865afa158015611b4c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b7091906124c4565b611b78575f80fd5b604051632a1f7ab160e21b815260048101859052602481018490526001600160f81b031983166044820152605d9063a87deac49060640161052f565b604051632fd514cd60e11b8152600481018290523360248201525f905f8051602061258e83398151915290635faa299a90604401602060405180830381865afa158015611c03573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611c2791906124c4565b611c2f575f80fd5b60405163a8b42a8960e01b815260048101839052605d9063a8b42a89906024016107b4565b604051632fd514cd60e11b8152600481018490523360248201525f905f8051602061258e83398151915290635faa299a90604401602060405180830381865afa158015611ca3573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611cc791906124c4565b611ccf575f80fd5b604051632fd514cd60e11b8152600481018490523360248201525f8051602061258e83398151915290635faa299a90604401602060405180830381865afa158015611d1c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d4091906124c4565b611d48575f80fd5b604051632fd514cd60e11b8152600481018390523360248201525f8051602061258e83398151915290635faa299a90604401602060405180830381865afa158015611d95573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611db991906124c4565b611dc1575f80fd5b60405163cb3b940760e01b8152600481018590526024810184905260448101839052605d9063cb3b94079060640161052f565b604051632fd514cd60e11b8152600481018490523360248201525f905f8051602061258e83398151915290635faa299a90604401602060405180830381865afa158015611e43573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e6791906124c4565b611e6f575f80fd5b6040516370628b5760e11b815260048101859052602481018490526001600160f81b031983166044820152605d9063e0c516ae9060640161052f565b604051631ce2e8d760e31b8152600481018390526001600160f81b0319821660248201525f90605d9063e71746b890604401610f87565b604051632fd514cd60e11b8152600481018490523360248201525f905f8051602061258e83398151915290635faa299a90604401602060405180830381865afa158015611f31573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611f5591906124c4565b611f5d575f80fd5b604051632fd514cd60e11b8152600481018490523360248201525f8051602061258e83398151915290635faa299a90604401602060405180830381865afa158015611faa573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611fce91906124c4565b611fd6575f80fd5b604051633b1015f760e21b815260048101859052602481018490526001600160f81b031983166044820152605d9063ec4057dc9060640161052f565b604051632fd514cd60e11b8152600481018490523360248201525f905f8051602061258e83398151915290635faa299a90604401602060405180830381865afa158015612061573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061208591906124c4565b61208d575f80fd5b6001600160f81b031982165f0361211757604051632fd514cd60e11b8152600481018490523360248201525f8051602061258e83398151915290635faa299a90604401602060405180830381865afa1580156120eb573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061210f91906124c4565b612117575f80fd5b604051633bb860cf60e21b815260048101859052602481018490526001600160f81b031983166044820152605d9063eee1833c9060640161052f565b604051632fd514cd60e11b8152600481018490523360248201525f905f8051602061258e83398151915290635faa299a90604401602060405180830381865afa1580156121a2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906121c691906124c4565b6121ce575f80fd5b6001600160f81b031982165f0361225857604051632fd514cd60e11b8152600481018490523360248201525f8051602061258e83398151915290635faa299a90604401602060405180830381865afa15801561222c573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061225091906124c4565b612258575f80fd5b60405163f953e42760e01b815260048101859052602481018490526001600160f81b031983166044820152605d9063f953e4279060640161052f565b604051636e76b8b960e11b8152600481018390526001600160f81b0319821660248201525f6044820181905290605d9063dced7172906064016020604051808303815f875af1158015610fa2573d5f803e3d5ffd5b80356001600160f81b031981168114612300575f80fd5b919050565b5f805f60608486031215612317575f80fd5b833592506020840135915061232e604085016122e9565b90509250925092565b5f60208284031215612347575f80fd5b5035919050565b634e487b7160e01b5f52604160045260245ffd5b5f805f8060808587031215612375575f80fd5b84359350602085013573ffffffffffffffffffffffffffffffffffffffff8116811461239f575f80fd5b9250604085013567ffffffffffffffff808211156123bb575f80fd5b818701915087601f8301126123ce575f80fd5b8135818111156123e0576123e061234e565b604051601f8201601f19908116603f011681019083821181831017156124085761240861234e565b816040528281528a6020848701011115612420575f80fd5b826020860160208301375f602084830101528096505050505050612446606086016122e9565b905092959194509250565b5f8060408385031215612462575f80fd5b82359150612472602084016122e9565b90509250929050565b5f6020828403121561248b575f80fd5b612494826122e9565b9392505050565b5f805f606084860312156124ad575f80fd5b505081359360208301359350604090920135919050565b5f602082840312156124d4575f80fd5b81518015158114612494575f80fd5b5f602082840312156124f3575f80fd5b5051919050565b8581525f602073ffffffffffffffffffffffffffffffffffffffff808816602085015280871660408501525060a0606084015284518060a08501525f5b818110156125535786810183015185820160c001528201612537565b505f60c0828601015260c0601f19601f8301168501019250505061258360808301846001600160f81b0319169052565b969550505050505056fe0000000000000000000000002fb4341027eb1d2ad8b5d9708187df8633cafa92a164736f6c6343000818000a", + "deployedBytecode": "0x608060405234801561000f575f80fd5b50600436106101c6575f3560e01c8063816d57d3116100fe578063a8b42a891161009e578063ec4057dc1161006e578063ec4057dc146103a6578063eee1833c146103b9578063f953e427146103cc578063fa33b7af146103df575f80fd5b8063a8b42a891461035a578063cb3b94071461036d578063e0c516ae14610380578063e71746b814610393575f80fd5b8063900d294e116100d9578063900d294e1461030e5780639675211f14610321578063a86e9de514610334578063a87deac414610347575f80fd5b8063816d57d3146102d557806389a4314b146102e85780638c14cc21146102fb575f80fd5b806336cdd31b116101695780634be68d20116101445780634be68d2014610289578063666a35881461029c578063694daf72146102af5780636be31758146102c2575f80fd5b806336cdd31b146102505780633e63c50a1461026357806344ae9c5c14610276575f80fd5b806319271081116101a457806319271081146102155780632c7d67b7146102285780632e817ff01461023b57806335334c231461024e575f80fd5b8063052896f1146101ca57806305907343146101ef57806313801ffa14610202575b5f80fd5b6101dd6101d8366004612305565b6103f2565b60405190815260200160405180910390f35b6101dd6101fd366004612305565b6105d7565b6101dd610210366004612337565b610718565b6101dd610223366004612305565b61085a565b6101dd610236366004612305565b61099b565b6101dd610249366004612362565b610acb565b005b6101dd61025e366004612305565b610ba2565b6101dd610271366004612305565b610c59565b6101dd610284366004612305565b610d9a565b6101dd610297366004612451565b610edb565b6101dd6102aa366004612305565b61102e565b6101dd6102bd366004612305565b61115e565b6101dd6102d0366004612305565b61129f565b6101dd6102e3366004612305565b6113e0565b6101dd6102f6366004612305565b611521565b6101dd610309366004612305565b611662565b6101dd61031c36600461247b565b6117a3565b6101dd61032f366004612305565b6117f1565b6101dd610342366004612305565b611932565b6101dd610355366004612305565b611a73565b6101dd610368366004612337565b611bb4565b6101dd61037b36600461249b565b611c54565b6101dd61038e366004612305565b611df4565b6101dd6103a1366004612451565b611eab565b6101dd6103b4366004612305565b611ee2565b6101dd6103c7366004612305565b612012565b6101dd6103da366004612305565b612153565b6101dd6103ed366004612451565b612294565b604051632fd514cd60e11b8152600481018490523360248201525f905f8051602061258e83398151915290635faa299a90604401602060405180830381865afa158015610441573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061046591906124c4565b61046d575f80fd5b6001600160f81b031982165f036104f757604051632fd514cd60e11b8152600481018490523360248201525f8051602061258e83398151915290635faa299a90604401602060405180830381865afa1580156104cb573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104ef91906124c4565b6104f7575f80fd5b60405163052896f160e01b815260048101859052602481018490526001600160f81b031983166044820152605d9063052896f1906064015b602060405180830381865afa15801561054a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061056e91906124e3565b6040516346ce4e4960e11b8152600481018290523360248201529091505f8051602061258e83398151915290638d9c9c92906044015f604051808303815f87803b1580156105ba575f80fd5b505af11580156105cc573d5f803e3d5ffd5b505050509392505050565b604051632fd514cd60e11b8152600481018490523360248201525f905f8051602061258e83398151915290635faa299a90604401602060405180830381865afa158015610626573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061064a91906124c4565b610652575f80fd5b6001600160f81b031982165f036106dc57604051632fd514cd60e11b8152600481018490523360248201525f8051602061258e83398151915290635faa299a90604401602060405180830381865afa1580156106b0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106d491906124c4565b6106dc575f80fd5b604051630590734360e01b815260048101859052602481018490526001600160f81b031983166044820152605d9063059073439060640161052f565b604051632fd514cd60e11b8152600481018290523360248201525f905f8051602061258e83398151915290635faa299a90604401602060405180830381865afa158015610767573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061078b91906124c4565b610793575f80fd5b6040516309c00ffd60e11b815260048101839052605d906313801ffa906024015b602060405180830381865afa1580156107cf573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107f391906124e3565b6040516346ce4e4960e11b8152600481018290523360248201529091505f8051602061258e83398151915290638d9c9c92906044015f604051808303815f87803b15801561083f575f80fd5b505af1158015610851573d5f803e3d5ffd5b50505050919050565b604051632fd514cd60e11b8152600481018490523360248201525f905f8051602061258e83398151915290635faa299a90604401602060405180830381865afa1580156108a9573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108cd91906124c4565b6108d5575f80fd5b6001600160f81b031982165f0361095f57604051632fd514cd60e11b8152600481018490523360248201525f8051602061258e83398151915290635faa299a90604401602060405180830381865afa158015610933573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061095791906124c4565b61095f575f80fd5b604051631927108160e01b815260048101859052602481018490526001600160f81b031983166044820152605d9063192710819060640161052f565b604051632fd514cd60e11b8152600481018490523360248201525f905f8051602061258e83398151915290635faa299a90604401602060405180830381865afa1580156109ea573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a0e91906124c4565b610a16575f80fd5b604051632fd514cd60e11b8152600481018490523360248201525f8051602061258e83398151915290635faa299a90604401602060405180830381865afa158015610a63573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a8791906124c4565b610a8f575f80fd5b604051632c7d67b760e01b815260048101859052602481018490526001600160f81b031983166044820152605d90632c7d67b79060640161052f565b604051633ef43c9560e11b81525f90605d90637de8792a90610af990889088903390899089906004016124fa565b602060405180830381865afa158015610b14573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b3891906124e3565b6040516346ce4e4960e11b8152600481018290523360248201529091505f8051602061258e83398151915290638d9c9c92906044015f604051808303815f87803b158015610b84575f80fd5b505af1158015610b96573d5f803e3d5ffd5b50505050949350505050565b604051632fd514cd60e11b8152600481018490523360248201525f905f8051602061258e83398151915290635faa299a90604401602060405180830381865afa158015610bf1573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c1591906124c4565b610c1d575f80fd5b6040516336cdd31b60e01b815260048101859052602481018490526001600160f81b031983166044820152605d906336cdd31b9060640161052f565b604051632fd514cd60e11b8152600481018490523360248201525f905f8051602061258e83398151915290635faa299a90604401602060405180830381865afa158015610ca8573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ccc91906124c4565b610cd4575f80fd5b6001600160f81b031982165f03610d5e57604051632fd514cd60e11b8152600481018490523360248201525f8051602061258e83398151915290635faa299a90604401602060405180830381865afa158015610d32573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d5691906124c4565b610d5e575f80fd5b604051631f31e28560e11b815260048101859052602481018490526001600160f81b031983166044820152605d90633e63c50a9060640161052f565b604051632fd514cd60e11b8152600481018490523360248201525f905f8051602061258e83398151915290635faa299a90604401602060405180830381865afa158015610de9573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e0d91906124c4565b610e15575f80fd5b6001600160f81b031982165f03610e9f57604051632fd514cd60e11b8152600481018490523360248201525f8051602061258e83398151915290635faa299a90604401602060405180830381865afa158015610e73573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e9791906124c4565b610e9f575f80fd5b60405163112ba71760e21b815260048101859052602481018490526001600160f81b031983166044820152605d906344ae9c5c9060640161052f565b604051632fd514cd60e11b8152600481018390523360248201525f905f8051602061258e83398151915290635faa299a90604401602060405180830381865afa158015610f2a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f4e91906124c4565b610f56575f80fd5b60405163025f346960e51b8152600481018490526001600160f81b031983166024820152605d90634be68d20906044015b602060405180830381865afa158015610fa2573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610fc691906124e3565b6040516346ce4e4960e11b8152600481018290523360248201529091505f8051602061258e83398151915290638d9c9c92906044015f604051808303815f87803b158015611012575f80fd5b505af1158015611024573d5f803e3d5ffd5b5050505092915050565b604051632fd514cd60e11b8152600481018490523360248201525f905f8051602061258e83398151915290635faa299a90604401602060405180830381865afa15801561107d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110a191906124c4565b6110a9575f80fd5b604051632fd514cd60e11b8152600481018490523360248201525f8051602061258e83398151915290635faa299a90604401602060405180830381865afa1580156110f6573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061111a91906124c4565b611122575f80fd5b604051630ccd46b160e31b815260048101859052602481018490526001600160f81b031983166044820152605d9063666a35889060640161052f565b604051632fd514cd60e11b8152600481018490523360248201525f905f8051602061258e83398151915290635faa299a90604401602060405180830381865afa1580156111ad573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111d191906124c4565b6111d9575f80fd5b6001600160f81b031982165f0361126357604051632fd514cd60e11b8152600481018490523360248201525f8051602061258e83398151915290635faa299a90604401602060405180830381865afa158015611237573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061125b91906124c4565b611263575f80fd5b6040516334a6d7b960e11b815260048101859052602481018490526001600160f81b031983166044820152605d9063694daf729060640161052f565b604051632fd514cd60e11b8152600481018490523360248201525f905f8051602061258e83398151915290635faa299a90604401602060405180830381865afa1580156112ee573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061131291906124c4565b61131a575f80fd5b6001600160f81b031982165f036113a457604051632fd514cd60e11b8152600481018490523360248201525f8051602061258e83398151915290635faa299a90604401602060405180830381865afa158015611378573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061139c91906124c4565b6113a4575f80fd5b604051630d7c62eb60e31b815260048101859052602481018490526001600160f81b031983166044820152605d90636be317589060640161052f565b604051632fd514cd60e11b8152600481018490523360248201525f905f8051602061258e83398151915290635faa299a90604401602060405180830381865afa15801561142f573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061145391906124c4565b61145b575f80fd5b6001600160f81b031982165f036114e557604051632fd514cd60e11b8152600481018490523360248201525f8051602061258e83398151915290635faa299a90604401602060405180830381865afa1580156114b9573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114dd91906124c4565b6114e5575f80fd5b60405163816d57d360e01b815260048101859052602481018490526001600160f81b031983166044820152605d9063816d57d39060640161052f565b604051632fd514cd60e11b8152600481018490523360248201525f905f8051602061258e83398151915290635faa299a90604401602060405180830381865afa158015611570573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061159491906124c4565b61159c575f80fd5b6001600160f81b031982165f0361162657604051632fd514cd60e11b8152600481018490523360248201525f8051602061258e83398151915290635faa299a90604401602060405180830381865afa1580156115fa573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061161e91906124c4565b611626575f80fd5b6040516389a4314b60e01b815260048101859052602481018490526001600160f81b031983166044820152605d906389a4314b9060640161052f565b604051632fd514cd60e11b8152600481018490523360248201525f905f8051602061258e83398151915290635faa299a90604401602060405180830381865afa1580156116b1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116d591906124c4565b6116dd575f80fd5b6001600160f81b031982165f0361176757604051632fd514cd60e11b8152600481018490523360248201525f8051602061258e83398151915290635faa299a90604401602060405180830381865afa15801561173b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061175f91906124c4565b611767575f80fd5b604051638c14cc2160e01b815260048101859052602481018490526001600160f81b031983166044820152605d90638c14cc219060640161052f565b604051635966f2b360e01b81526001600160f81b0319821660048201525f6024820181905290605d90635966f2b3906044016020604051808303815f875af11580156107cf573d5f803e3d5ffd5b604051632fd514cd60e11b8152600481018490523360248201525f905f8051602061258e83398151915290635faa299a90604401602060405180830381865afa158015611840573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061186491906124c4565b61186c575f80fd5b6001600160f81b031982165f036118f657604051632fd514cd60e11b8152600481018490523360248201525f8051602061258e83398151915290635faa299a90604401602060405180830381865afa1580156118ca573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118ee91906124c4565b6118f6575f80fd5b604051639675211f60e01b815260048101859052602481018490526001600160f81b031983166044820152605d90639675211f9060640161052f565b604051632fd514cd60e11b8152600481018490523360248201525f905f8051602061258e83398151915290635faa299a90604401602060405180830381865afa158015611981573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119a591906124c4565b6119ad575f80fd5b6001600160f81b031982165f03611a3757604051632fd514cd60e11b8152600481018490523360248201525f8051602061258e83398151915290635faa299a90604401602060405180830381865afa158015611a0b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a2f91906124c4565b611a37575f80fd5b60405163a86e9de560e01b815260048101859052602481018490526001600160f81b031983166044820152605d9063a86e9de59060640161052f565b604051632fd514cd60e11b8152600481018490523360248201525f905f8051602061258e83398151915290635faa299a90604401602060405180830381865afa158015611ac2573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611ae691906124c4565b611aee575f80fd5b6001600160f81b031982165f03611b7857604051632fd514cd60e11b8152600481018490523360248201525f8051602061258e83398151915290635faa299a90604401602060405180830381865afa158015611b4c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b7091906124c4565b611b78575f80fd5b604051632a1f7ab160e21b815260048101859052602481018490526001600160f81b031983166044820152605d9063a87deac49060640161052f565b604051632fd514cd60e11b8152600481018290523360248201525f905f8051602061258e83398151915290635faa299a90604401602060405180830381865afa158015611c03573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611c2791906124c4565b611c2f575f80fd5b60405163a8b42a8960e01b815260048101839052605d9063a8b42a89906024016107b4565b604051632fd514cd60e11b8152600481018490523360248201525f905f8051602061258e83398151915290635faa299a90604401602060405180830381865afa158015611ca3573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611cc791906124c4565b611ccf575f80fd5b604051632fd514cd60e11b8152600481018490523360248201525f8051602061258e83398151915290635faa299a90604401602060405180830381865afa158015611d1c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d4091906124c4565b611d48575f80fd5b604051632fd514cd60e11b8152600481018390523360248201525f8051602061258e83398151915290635faa299a90604401602060405180830381865afa158015611d95573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611db991906124c4565b611dc1575f80fd5b60405163cb3b940760e01b8152600481018590526024810184905260448101839052605d9063cb3b94079060640161052f565b604051632fd514cd60e11b8152600481018490523360248201525f905f8051602061258e83398151915290635faa299a90604401602060405180830381865afa158015611e43573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e6791906124c4565b611e6f575f80fd5b6040516370628b5760e11b815260048101859052602481018490526001600160f81b031983166044820152605d9063e0c516ae9060640161052f565b604051631ce2e8d760e31b8152600481018390526001600160f81b0319821660248201525f90605d9063e71746b890604401610f87565b604051632fd514cd60e11b8152600481018490523360248201525f905f8051602061258e83398151915290635faa299a90604401602060405180830381865afa158015611f31573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611f5591906124c4565b611f5d575f80fd5b604051632fd514cd60e11b8152600481018490523360248201525f8051602061258e83398151915290635faa299a90604401602060405180830381865afa158015611faa573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611fce91906124c4565b611fd6575f80fd5b604051633b1015f760e21b815260048101859052602481018490526001600160f81b031983166044820152605d9063ec4057dc9060640161052f565b604051632fd514cd60e11b8152600481018490523360248201525f905f8051602061258e83398151915290635faa299a90604401602060405180830381865afa158015612061573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061208591906124c4565b61208d575f80fd5b6001600160f81b031982165f0361211757604051632fd514cd60e11b8152600481018490523360248201525f8051602061258e83398151915290635faa299a90604401602060405180830381865afa1580156120eb573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061210f91906124c4565b612117575f80fd5b604051633bb860cf60e21b815260048101859052602481018490526001600160f81b031983166044820152605d9063eee1833c9060640161052f565b604051632fd514cd60e11b8152600481018490523360248201525f905f8051602061258e83398151915290635faa299a90604401602060405180830381865afa1580156121a2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906121c691906124c4565b6121ce575f80fd5b6001600160f81b031982165f0361225857604051632fd514cd60e11b8152600481018490523360248201525f8051602061258e83398151915290635faa299a90604401602060405180830381865afa15801561222c573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061225091906124c4565b612258575f80fd5b60405163f953e42760e01b815260048101859052602481018490526001600160f81b031983166044820152605d9063f953e4279060640161052f565b604051636e76b8b960e11b8152600481018390526001600160f81b0319821660248201525f6044820181905290605d9063dced7172906064016020604051808303815f875af1158015610fa2573d5f803e3d5ffd5b80356001600160f81b031981168114612300575f80fd5b919050565b5f805f60608486031215612317575f80fd5b833592506020840135915061232e604085016122e9565b90509250925092565b5f60208284031215612347575f80fd5b5035919050565b634e487b7160e01b5f52604160045260245ffd5b5f805f8060808587031215612375575f80fd5b84359350602085013573ffffffffffffffffffffffffffffffffffffffff8116811461239f575f80fd5b9250604085013567ffffffffffffffff808211156123bb575f80fd5b818701915087601f8301126123ce575f80fd5b8135818111156123e0576123e061234e565b604051601f8201601f19908116603f011681019083821181831017156124085761240861234e565b816040528281528a6020848701011115612420575f80fd5b826020860160208301375f602084830101528096505050505050612446606086016122e9565b905092959194509250565b5f8060408385031215612462575f80fd5b82359150612472602084016122e9565b90509250929050565b5f6020828403121561248b575f80fd5b612494826122e9565b9392505050565b5f805f606084860312156124ad575f80fd5b505081359360208301359350604090920135919050565b5f602082840312156124d4575f80fd5b81518015158114612494575f80fd5b5f602082840312156124f3575f80fd5b5051919050565b8581525f602073ffffffffffffffffffffffffffffffffffffffff808816602085015280871660408501525060a0606084015284518060a08501525f5b818110156125535786810183015185820160c001528201612537565b505f60c0828601015260c0601f19601f8301168501019250505061258360808301846001600160f81b0319169052565b969550505050505056fe0000000000000000000000002fb4341027eb1d2ad8b5d9708187df8633cafa92a164736f6c6343000818000a", + "linkReferences": {}, + "deployedLinkReferences": {} +}