diff --git a/.env.example b/.env.example new file mode 100644 index 000000000..a293b6aaf --- /dev/null +++ b/.env.example @@ -0,0 +1,5 @@ +E2E_PRIVATE_KEY_ONE= +E2E_PRIVATE_KEY_TWO= +E2E_BICO_PAYMASTER_KEY_MUMBAI= +E2E_BICO_PAYMASTER_KEY_BASE= +BICONOMY_SDK_DEBUG=true \ No newline at end of file diff --git a/.eslintrc.js b/.eslintrc.js index 78d998dfd..eb97a48dc 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -23,9 +23,11 @@ module.exports = { "@typescript-eslint/no-unused-vars": ["error", { argsIgnorePattern: "^_" }], "security/detect-object-injection": "warn", "security/detect-unsafe-regex": "error", - "import/extensions": "off", + "import/extensions": "error", // Now we need to specify extensions for imports for esm builds "security/detect-object-injection": "off", // turning off Injection Sink rule "@typescript-eslint/no-throw-literal": "off", // temp deactivated needs to be removed once fixed + "@typescript-eslint/ban-ts-ignore": "off", + "@typescript-eslint/ban-ts-comment": "off", }, settings: {}, overrides: [ diff --git a/.github/workflows/check_branch_name.yml b/.github/workflows/check_branch_name.yml index 9c4cf9a67..39422432d 100644 --- a/.github/workflows/check_branch_name.yml +++ b/.github/workflows/check_branch_name.yml @@ -18,4 +18,4 @@ jobs: if [[ ! $BRANCH_NAME =~ ^(features/|fixes/|releases/) ]]; then echo "error: Branch names should follow GitFlow naming convention (features/, fixes/, releases/)." exit 1 - fi \ No newline at end of file + fi diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml new file mode 100644 index 000000000..5b5dd6522 --- /dev/null +++ b/.github/workflows/docs.yml @@ -0,0 +1,27 @@ +name: Build and Deploy Documentation +on: + workflow_dispatch: + push: + branches: + - develop + - v4 + +permissions: + contents: write +jobs: + build-docs-and-deploy: + runs-on: ubuntu-latest + steps: + - name: Checkout 🛎️ + uses: actions/checkout@v3 + + - name: Install and Build + run: | + yarn + yarn build + yarn --cwd ./packages/account docs + + - name: Deploy 🚀 + uses: JamesIves/github-pages-deploy-action@v4 + with: + folder: ./packages/account/docs diff --git a/.github/workflows/pull_request_approved.yml b/.github/workflows/pull_request_approved.yml new file mode 100644 index 000000000..d4f142659 --- /dev/null +++ b/.github/workflows/pull_request_approved.yml @@ -0,0 +1,33 @@ +name: E2E Test workflow +on: + pull_request_review: + types: [submitted] + workflow_dispatch: +jobs: + e2e_test: + if: github.event.review.state == 'approved' + name: E2E tests + runs-on: ubuntu-latest + strategy: + matrix: + node-version: [18.x] + + steps: + - name: Checkout + uses: "actions/checkout@main" + + - name: Set Node.js + uses: actions/setup-node@v1 + with: + node-version: ${{ matrix.node-version }} + + - name: Install dependencies + run: yarn install --frozen-lockfile && yarn build + + - name: Run tests + env: + E2E_PRIVATE_KEY_ONE: ${{ secrets.E2E_PRIVATE_KEY_ONE }} + E2E_PRIVATE_KEY_TWO: ${{ secrets.E2E_PRIVATE_KEY_TWO }} + E2E_BICO_PAYMASTER_KEY_MUMBAI: ${{ secrets.E2E_BICO_PAYMASTER_KEY_MUMBAI }} + E2E_BICO_PAYMASTER_KEY_BASE: ${{ secrets.E2E_BICO_PAYMASTER_KEY_BASE }} + run: yarn test:e2e diff --git a/.github/workflows/push_check.yml b/.github/workflows/push_check.yml index 6cfca05c1..35705a430 100644 --- a/.github/workflows/push_check.yml +++ b/.github/workflows/push_check.yml @@ -1,5 +1,6 @@ name: Test workflow -on: push +on: [push, workflow_dispatch] + jobs: lint: name: Lint sources diff --git a/.gitignore b/.gitignore index 3ac2e3158..cc1d5d78c 100644 --- a/.gitignore +++ b/.gitignore @@ -3,7 +3,6 @@ logs *.log yarn-debug.log* yarn-error.log* -yarn.lock lockfiles # Diagnostic reports (https://nodejs.org/api/report.html) @@ -47,7 +46,6 @@ node_modules/ .yarn/build-state.yml .yarn/install-state.gz .pnp.* -yarn.lock # macOS .DS_Store @@ -58,20 +56,23 @@ artifacts deployments # lockfiles -packages/core-types/package-lock.json packages/account/package-lock.json -packages/common/package-lock.json +packages/modules/package-lock.json packages/bundler/package-lock.json -packages/node-client/package-lock.json packages/paymaster/package-lock.json packages/particle-auth/package-lock.json -packages/web3-auth/package-lock.json -packages/web3-auth-native/package-lock.json packages/transak/package-lock.json package-lock.json -yarn.lock + +#ignore sessionStorageData files +packages/modules/tests/utils/sessionStorageData/* +#except sessionStorageData folder +!packages/modules/tests/utils/sessionStorageData/.gitkeep # Typechain typechain openapi/ + +# docs +packages/account/docs/* \ No newline at end of file diff --git a/.nvmrc b/.nvmrc index c9d82507f..b1215e876 100644 --- a/.nvmrc +++ b/.nvmrc @@ -1 +1 @@ -v14.17.0 \ No newline at end of file +v18.16.0 \ No newline at end of file diff --git a/README.md b/README.md index 096b1e7f2..00c720607 100644 --- a/README.md +++ b/README.md @@ -1,14 +1,31 @@ -# Biconomy SDK: Your Gateway to ERC4337 Account Abstraction & Smart Accounts 🛠️ +# Biconomy SDK -![Biconomy SDK](https://img.shields.io/badge/Biconomy-SDK-blue.svg) ![TypeScript](https://img.shields.io/badge/-TypeScript-blue) ![Test Coverage](https://img.shields.io/badge/Coverage-45%25-yellow.svg) +![Biconomy SDK](https://img.shields.io/badge/Biconomy-SDK-blue.svg) +![TypeScript](https://img.shields.io/badge/-TypeScript-blue) +![Test Coverage](https://img.shields.io/badge/Coverage-79.82%25-green.svg) -

Biconomy SDK Banner

+## 👋 Introduction -## Introduction +The Biconomy SDK is your all-in-one toolkit for building decentralized applications (dApps) with **ERC4337 Account Abstraction** and **Smart Accounts**. It is designed for seamless user experiences and offers non-custodial solutions for user onboarding, sending transactions (userOps), gas sponsorship and much more. -The Biconomy SDK is your all-in-one toolkit for building decentralized applications (dApps) with **ERC4337 Account Abstraction** and **Smart Accounts**. This SDK is designed for seamless user experiences and offers non-custodial solutions for user onboarding, transaction management, and gas abstraction. +## 🛠️ Quickstart + +```typescript +import { createSmartAccountClient } from "@biconomy/account"; + +const smartAccount = await createSmartAccountClient({ + signer: viemWalletOrEthersSigner, + bundlerUrl: "", // From dashboard.biconomy.io + biconomyPaymasterApiKey: "", // From dashboard.biconomy.io +}); + +const { wait } = await smartAccount.sendTransaction({ to: "0x...", value: 1 }); -

Biconomy SDK Diagram

+const { + receipt: { transactionHash }, + userOpHash, +} = await wait(); +``` ## 🌟 Features @@ -16,75 +33,101 @@ The Biconomy SDK is your all-in-one toolkit for building decentralized applicati - **Smart Accounts**: Enhance user experience with modular smart accounts. - **Paymaster Service**: Enable third-party gas sponsorship. - **Bundler Infrastructure**: Ensure efficient and reliable transaction bundling. -- **Backend Node**: Manage chain configurations and gas estimations. - -## 📦 Packages - -### Account - -Unlock the full potential of **ERC4337 Account Abstraction** with methods that simplify the creation and dispatch of UserOperations, streamlining dApp development and management. - -```javascript -import { ECDSAOwnershipValidationModule, DEFAULT_ECDSA_OWNERSHIP_MODULE } from "@biconomy/modules"; -import { IBundler, Bundler } from '@biconomy/bundler' -import { DEFAULT_ENTRYPOINT_ADDRESS } from "@biconomy/account" -import { providers } from 'ethers' -import { ChainId } from "@biconomy/core-types" +For a step-by-step guide on integrating **ERC4337 Account Abstraction** and **Smart Accounts** into your dApp using the Biconomy SDK, refer to the [official documentation](https://docs.biconomy.io/docs/overview). You can also start with Quick start [here](https://docs.biconomy.io/quickstart). +## 📚 Resources -const module = await ECDSAOwnershipValidationModule.create({ - signer: wallet, - moduleAddress: DEFAULT_ECDSA_OWNERSHIP_MODULE - }) +- [Biconomy Documentation](https://docs.biconomy.io/) +- [Biconomy Dashboard](https://dashboard.biconomy.io) +- [TSDoc](https://bcnmy.github.io/biconomy-client-sdk) -const biconomySmartAccount = await BiconomySmartAccountV2.create({ - chainId: ChainId.POLYGON_MUMBAI, - bundler: bundler, - paymaster: paymaster, - entryPointAddress: DEFAULT_ENTRYPOINT_ADDRESS, - defaultValidationModule: module, - activeValidationModule: module -}) +## ⚙️ installation -console.log("address: ", await biconomySmartAccount.getAccountAddress()); +```bash +npm i @biconomy/account ``` -### Bundler +## 💼 Example Usages -Leverage standardized bundler infrastructure for efficient operation of account abstraction across EVM networks. +### [Initialise the smartAccount](https://bcnmy.github.io/biconomy-client-sdk/functions/createSmartAccountClient.html) -```javascript +| Key | Description | +| -------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------- | +| [signer](https://bcnmy.github.io/biconomy-client-sdk/packages/account/docs/interfaces/SmartAccountSigner.html) | This signer will be used for signing userOps for any transactions you build. Will accept ethers.JsonRpcSigner as well as a viemWallet | +| [biconomyPaymasterApiKey](https://dashboard.biconomy.io) | You can pass in a biconomyPaymasterApiKey necessary for sponsoring transactions (retrieved from the biconomy dashboard) | +| [bundlerUrl](https://dashboard.biconomy.io) | You can pass in a bundlerUrl (retrieved from the biconomy dashboard) for sending transactions | -import { IBundler, Bundler } from '@biconomy/bundler' +```typescript +import { createSmartAccountClient } from "@biconomy/account"; +import { createWalletClient, http, createPublicClient } from "viem"; +import { privateKeyToAccount, generatePrivateKey } from "viem/accounts"; +import { mainnet as chain } from "viem/chains"; +const account = privateKeyToAccount(generatePrivateKey()); +const signer = createWalletClient({ account, chain, transport: http() }); -const bundler: IBundler = new Bundler({ - bundlerUrl: 'https://bundler.biconomy.io/api/v2/80001/', - // Please go to https://dashboard.biconomy.io and generate bundler url - chainId: ChainId.POLYGON_MUMBAI, - entryPointAddress: DEFAULT_ENTRYPOINT_ADDRESS, - }) +const smartAccount = await createSmartAccountClient({ + signer, + bundlerUrl, + biconomyPaymasterApiKey, +}); ``` -### Paymaster +### [Send some ETH, have gas sponsored](https://bcnmy.github.io/biconomy-client-sdk/classes/BiconomySmartAccountV2.html#sendTransaction) + +| Key | Description | +| --------------------------------------------------------------------------------- | -------------------------------------------------------------- | +| [oneOrManyTx](https://bcnmy.github.io/biconomy-client-sdk/types/Transaction.html) | Submit multiple or one transactions | +| [userOpReceipt](https://bcnmy.github.io/biconomy-client-sdk/types/UserOpReceipt) | Returned information about your tx, receipts, userOpHashes etc | -Acting as third-party intermediaries, Paymasters have the capability to sponsor gas fees for an account, provided specific predefined conditions are met. Additionally, they can accept gas payments in ERC20 tokens from users' smart accounts, with the Paymaster managing the conversion to native tokens for gas payment. +```typescript +const oneOrManyTx = { to: "0x...", value: 1 }; -```javascript -const paymaster: IPaymaster = new BiconomyPaymaster({ - paymasterUrl: '' // From Biconomy Dashboard +const { wait } = await smartAccount.sendTransaction(oneOrManyTx, { + mode: PaymasterMode.SPONSORED, }); + +const { + receipt: { transactionHash }, + userOpHash, +} = await wait(); ``` -## 🛠️ Quickstart +### [Mint two NFTs, pay gas with token](https://bcnmy.github.io/biconomy-client-sdk/classes/BiconomySmartAccountV2.html#getTokenFees) -For a step-by-step guide on integrating **ERC4337 Account Abstraction** and **Smart Accounts** into your dApp using the Biconomy SDK, refer to the [official documentation](https://docs.biconomy.io/docs/overview). You can also start with Quick explore here https://docs.biconomy.io/docs/category/quick-explore +| Key | Description | +| -------------------------------------------------------------------------------------------------------- | ------------------------------------------ | +| [buildUseropDto](https://bcnmy.github.io/biconomy-client-sdk/types/BuildUserOpOptions.html) | Options for building a userOp | +| [paymasterServiceData](https://bcnmy.github.io/biconomy-client-sdk/types/PaymasterUserOperationDto.html) | PaymasterOptions set in the buildUseropDto | -## 📚 Resources +```typescript +import { encodeFunctionData, parseAbi } from "viem"; + +const encodedCall = encodeFunctionData({ + abi: parseAbi(["function safeMint(address to) public"]), + functionName: "safeMint", + args: ["0x..."], +}); -- [Biconomy Documentation](https://docs.biconomy.io/docs/overview) -- [Biconomy Dashboard](https://dashboard.biconomy.io/) +const tx = { + to: nftAddress, + data: encodedCall, +}; +const oneOrManyTx = [tx, tx]; // Mint twice +const paymasterServiceData = { + mode: PaymasterMode.ERC20, + preferredToken: "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", // USDC +}; +const buildUseropDto = { paymasterServiceData }; + +const { wait } = await smartAccount.sendTransaction(oneOrManyTx, buildUseropDto); + +const { + receipt: { transactionHash }, + userOpHash, +} = await wait(); +``` ## 🤝 Contributing diff --git a/jest.config.e2e.ts b/jest.config.e2e.ts new file mode 100644 index 000000000..2fff1ca6d --- /dev/null +++ b/jest.config.e2e.ts @@ -0,0 +1,6 @@ +import config from "./jest.config"; +const e2eConfig = { ...config }; +e2eConfig.testMatch = ["**/*.e2e.spec.ts"]; +e2eConfig.setupFilesAfterEnv = ["/tests/setup-e2e-tests.ts"]; + +export default e2eConfig; diff --git a/jest.config.ts b/jest.config.ts index a968e1995..7cc8b4123 100644 --- a/jest.config.ts +++ b/jest.config.ts @@ -78,7 +78,11 @@ const config: Config = { moduleFileExtensions: ["js", "mjs", "cjs", "jsx", "ts", "tsx", "json", "node"], // A map from regular expressions to module names or to arrays of module names that allow to stub out resources with a single module - // moduleNameMapper: {}, + moduleNameMapper: { + '^(?!bn\.js$|hash\.js$)(.+)\\.js$': '$1' + }, + + extensionsToTreatAsEsm: ['.ts'], // An array of regexp pattern strings, matched against all module paths before considered 'visible' to the module loader // modulePathIgnorePatterns: [], @@ -123,7 +127,7 @@ const config: Config = { // setupFiles: [], // A list of paths to modules that run some code to configure or set up the testing framework before each test - // setupFilesAfterEnv: [], + setupFilesAfterEnv: ["/tests/setup-unit-tests.ts"], // The number of seconds after which a test is considered as slow and reported as such in the results. // slowTestThreshold: 5, @@ -141,7 +145,7 @@ const config: Config = { // testLocationInResults: false, // The glob patterns Jest uses to detect test files - testMatch: ["**/*.spec.ts"], + testMatch: ["**/*.spec.ts", "!**/*.e2e.spec.ts"], // An array of regexp pattern strings that are matched against all test paths, matched tests are skipped // testPathIgnorePatterns: [ @@ -159,7 +163,7 @@ const config: Config = { // A map from regular expressions to paths to transformers transform: { - "^.+\\.tsx?$": "ts-jest", + "^.+\\.tsx?$": ["ts-jest", { useESM: true }], }, // An array of regexp pattern strings that are matched against all source file paths, matched files will skip transformation @@ -179,6 +183,10 @@ const config: Config = { // Whether to use watchman for file crawling // watchman: true, + + globals: { + testDataPerChain: [], + } }; -export default config; +export default config; \ No newline at end of file diff --git a/linkAll.sh b/linkAll.sh index 6e9f511b6..3597ec1c0 100755 --- a/linkAll.sh +++ b/linkAll.sh @@ -1,2 +1,3 @@ !/bin/sh -for dir in ./packages/*; do (cd "$dir" && yarn link); done \ No newline at end of file +for dir in ./packages/*; do (cd "$dir" && yarn link); done +cd ./packages/account && yarn link '@biconomy/bundler' '@biconomy/modules' '@biconomy/paymaster' '@biconomy/common' \ No newline at end of file diff --git a/package.json b/package.json index 65f030a37..0939192fb 100644 --- a/package.json +++ b/package.json @@ -26,10 +26,10 @@ "author": "Biconomy (https://biconomy.io)", "private": true, "scripts": { - "dev": "yarn rebuild && yarn install && yarn build && yarn link:all", + "dev": "yarn rebuild && yarn install && lerna run build && yarn link:all", "rebuild": "./rebuild.sh", "link:all": "./linkAll.sh", - "build": "lerna run build", + "build": "yarn rebuild && yarn install && lerna run build", "clean": "lerna clean && lerna run unbuild", "format": "lerna run format --npm-client=yarn", "prettier": "npx prettier --write .", @@ -40,6 +40,7 @@ "start:ganache": "ganache -m 'direct buyer cliff train rice spirit census refuse glare expire innocent quote'", "test:ci": "FORCE_COLOR=1 lerna run test:ci --stream --npm-client=yarn", "test:coverage": "concurrently -k --success first 'yarn start:ganache' 'yarn jest --runInBand --coverage'", + "test:e2e": "yarn test:run --config=jest.config.e2e.ts", "diff": "lerna diff", "release": "lerna version patch --no-git-tag-version --no-push --conventional-commits --yes" }, @@ -56,13 +57,14 @@ }, "dependencies": { "node-gyp": "^9.4.0", - "typescript": "^5.2.2" + "typescript": "^5.3.3" }, "devDependencies": { "@types/debug": "^4.1.9", "@types/jest": "^29.5.4", "@typescript-eslint/eslint-plugin": "^6.7.0", "@typescript-eslint/parser": "^6.6.0", + "concurrently": "^8.2.2", "eslint": "^8.48.0", "eslint-config-airbnb-base": "15.0.0", "eslint-config-airbnb-typescript": "17.1.0", @@ -70,7 +72,7 @@ "eslint-plugin-import": "^2.28.1", "eslint-plugin-prettier": "^5.0.0", "eslint-plugin-security": "^1.7.1", - "ganache": "^7.9.1", + "ganache": "^7.9.2", "hardhat": "^2.17.3", "jest": "^29.7.0", "lerna": "^7.2.0", diff --git a/packages/account/.esbuild.js b/packages/account/.esbuild.js new file mode 100644 index 000000000..ca355e346 --- /dev/null +++ b/packages/account/.esbuild.js @@ -0,0 +1,58 @@ +const esbuildPluginTsc = require("esbuild-plugin-tsc"); +const esbuild = require("esbuild"); +const { dependencies, peerDependencies = {} } = require("./package.json"); +const { Generator } = require("npm-dts"); + +const COMMON_SETTINGS = { + entryPoints: ["src/index.ts"], + minify: true, + bundle: true, + plugins: [esbuildPluginTsc({ force: true })], +}; + +const ESM_SETTINGS = { + ...COMMON_SETTINGS, + sourcemap: true, + outfile: "dist/esm/index.js", + platform: "browser", + target: "esnext", + format: "esm", + mainFields: ["browser", "module", "main"], +}; +const buildForESM = async () => await esbuild.build(ESM_SETTINGS); + +const CJS_SETTINGS = { + ...COMMON_SETTINGS, + format: "cjs", + sourcemap: false, + outfile: "dist/cjs/index.js", + platform: "node", +}; + +const watchForCJS = async () => { + let ctx = await esbuild.context(CJS_SETTINGS); + await ctx.watch(); + await ctx.serve({ servedir: "dist/src" }); + console.log("watching..."); +}; + +const buildForCJS = async () => await esbuild.build(CJS_SETTINGS); +const buildForTYP = async () => await new Generator({ entry: "src/index.ts", output: "dist/types/index.d.ts" }).generate(); + +(async () => { + const buildType = process.argv.slice(2)[0]; + const shouldWatch = process.argv.slice(3)[0] === "--watch"; + if (!buildType) { + console.log("No build type provided"); + process.exit(1); + } + console.log(`Building for ${buildType}`); + if (buildType === "ESM") { + await buildForESM(); + } else if (buildType === "CJS") { + console.log("watching? " + shouldWatch); + await (shouldWatch ? watchForCJS : buildForCJS)(); + } else if (buildType === "TYP") { + await buildForTYP(); + } +})(); diff --git a/packages/account/CHANGELOG.md b/packages/account/CHANGELOG.md index f2f70fe1f..abff0df13 100644 --- a/packages/account/CHANGELOG.md +++ b/packages/account/CHANGELOG.md @@ -3,6 +3,40 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## 4.0.0 (2023-02-06) + +### Features + +- Export bundler / paymaster instances + helpers from master package ([1d1f9d](https://github.com/bcnmy/biconomy-client-sdk/pull/401/commits/1d1f9dafddf11bde0e1a75383bc935b22448bedd)) +- Export modules aliases from master package ([d6205c](https://github.com/bcnmy/biconomy-client-sdk/pull/401/commits/d6205c4d76ab846ecdc10843c65e0277f3ceab00)) +- Added sendTransaction abstraction for buildUserOp + sendUserOp ([335c6e](https://github.com/bcnmy/biconomy-client-sdk/pull/401/commits/335c6e7bfc5ca1ad240e7cbfd678d905c7f16812)) +- Reduced bundle size ([765a3e3](https://github.com/bcnmy/biconomy-client-sdk/commit/765a3e337fb9ad8f1f8dc92b5edcb1ed0940f94d)) +- Added bundler abstraction during SmartAccount init ([591bbb4](https://github.com/bcnmy/biconomy-client-sdk/pull/401/commits/591bbb4e37774b16cbe801d583d31b3a14608bc1)) +- Added e2e tests that speak with prod bundler / paymasters ([4b4a53a](https://github.com/bcnmy/biconomy-client-sdk/pull/401/commits/4b4a53aabdf9e22485599872332b3d63e8ddd87a)) +- Added support for simultaneous ethers + viem signers ([8e4b2c8](https://github.com/bcnmy/biconomy-client-sdk/pull/401/commits/8e4b2c86b871130befbf3b733cf503d24f7226a5)) +- E2E tests for multichain modules ([ecc86e2](https://github.com/bcnmy/biconomy-client-sdk/pull/401/commits/ecc86e2c7146046a981c3b6fd4bb29e4828b278b)) +- E2E tests for session validation modules ([4ad7ea7](https://github.com/bcnmy/biconomy-client-sdk/pull/401/commits/4ad7ea7f8eb6a28854dcce83834b2b7ff9ad3287)) +- Added [TSDoc](https://bcnmy.github.io/biconomy-client-sdk) ([638dae](https://github.com/bcnmy/biconomy-client-sdk/pull/401/commits/638daee0ed6924f67c5151a2d0e5a02d32e4bf23)) +- Make txs more typesafe and default with valueOrData ([b1e5b5e](https://github.com/bcnmy/biconomy-client-sdk/pull/401/commits/b1e5b5e02ab3a7fb99faa1d45b55e3cbe8d6bc93)) +- Added createSmartAccountClient alias ([232472](https://github.com/bcnmy/biconomy-client-sdk/pull/401/commits/232472c788bed0619cf6295ade076b6ec3a9e0f8)) +- Improve dx of using paymster to build userOps ([bb54888](https://github.com/bcnmy/biconomy-client-sdk/pull/401/commits/bb548884e76a94a20329e49b18994503de9e3888)) +- Add ethers v6 signer support ([9727fd](https://github.com/bcnmy/biconomy-client-sdk/pull/401/commits/9727fd51e47d62904399d17d48f5c9d6b9e591e5)) +- Improved dx of using gas payments with erc20 ([741806](https://github.com/bcnmy/biconomy-client-sdk/pull/401/commits/741806da68457eba262e1a49be77fcc24360ba36)) + +### Chores + +- Removed SmartAccount Base class in favour of Alchemy's ([be82732](https://github.com/bcnmy/biconomy-client-sdk/commit/be827327fafa858b1551ade0c8389293034cacbb)) +- Migrate to viem v2 ([8ce04a](https://github.com/bcnmy/biconomy-client-sdk/pull/401/commits/8ce04a56f6dcdfd1f44d9534f43e3c6eb8b3885d)) +- Remove common + core-types dependencies ([673514](https://github.com/bcnmy/biconomy-client-sdk/pull/401/commits/6735141fbd21a855aadf69011bc06c69e20f811b)) +- Reincluded simulation flags ([25d2be](https://github.com/bcnmy/biconomy-client-sdk/pull/401/commits/25d2bee339afd9d8c143fe6dad1898e28034be17)) + +### Bug Fixes + +- Make silently failing paymaster calls throw an error instead ([693bf0](https://github.com/bcnmy/biconomy-client-sdk/pull/401/commits/693bf08591427c03e317d64d0491e23b1c96ea30)) +- Added string as a supported Transaction value type ([b905dc](https://github.com/bcnmy/biconomy-client-sdk/pull/401/commits/b905dcf3f7849396573fc8b51f808cc68061ee11)) +- Removed skipBundlerGasEstimation option ([b905dc](https://github.com/bcnmy/biconomy-client-sdk/pull/401/commits/b905dcf3f7849396573fc8b51f808cc68061ee11)) +- Ingest rpcUrl from SupportedSigners (ethers + viem) ([f56b4d](https://github.com/bcnmy/biconomy-client-sdk/pull/401/commits/f56b4da08f47af577c01a641b81a3ef9e354cf97)) + ## 3.1.3 (2023-12-28) VERSION Bump Only. @@ -11,54 +45,44 @@ VERSION Bump Only. ### Features -* Make entryPointAddress optional in config([cf35c4a](https://github.com/bcnmy/biconomy-client-sdk/pull/336/commits/cf35c4a8266d27648035d8c9d63f1b9157553128)) +- Make entryPointAddress optional in config([cf35c4a](https://github.com/bcnmy/biconomy-client-sdk/pull/336/commits/cf35c4a8266d27648035d8c9d63f1b9157553128)) ### Bug Fixes -* use undefined in place of ! + check on limits returned by paymaster and throw ([0376901](https://github.com/bcnmy/biconomy-client-sdk/commit/0376901b7aec8c268a6a3c654d147335974d78f3)) -* change receipt status type from boolean to string to be compatible with bundler response. ([317f986](https://github.com/bcnmy/biconomy-client-sdk/pull/342/commits/317f986b7e8f08d3ccf1e68f12a0696f1116de6b)) +- use undefined in place of ! + check on limits returned by paymaster and throw ([0376901](https://github.com/bcnmy/biconomy-client-sdk/commit/0376901b7aec8c268a6a3c654d147335974d78f3)) +- change receipt status type from boolean to string to be compatible with bundler response. ([317f986](https://github.com/bcnmy/biconomy-client-sdk/pull/342/commits/317f986b7e8f08d3ccf1e68f12a0696f1116de6b)) ## 3.1.1 (2023-11-09) - ### Bug Fixes -* optimistic implementation for getNonce() and cache for isAccountDeployed ([5b1d4bf](https://github.com/bcnmy/biconomy-client-sdk/commit/5b1d4bfd7b5062d05bbb97286b833d879cd972b0)) - +- optimistic implementation for getNonce() and cache for isAccountDeployed ([5b1d4bf](https://github.com/bcnmy/biconomy-client-sdk/commit/5b1d4bfd7b5062d05bbb97286b833d879cd972b0)) ### Reverts -* update paymaster check in estimateUserOpGas ([2eb0237](https://github.com/bcnmy/biconomy-client-sdk/commit/2eb0237b37425da3558801bbe9d0ce5d6fd696c9)) - - - - +- update paymaster check in estimateUserOpGas ([2eb0237](https://github.com/bcnmy/biconomy-client-sdk/commit/2eb0237b37425da3558801bbe9d0ce5d6fd696c9)) ## 3.1.0 (2023-09-20) + Modular Account Abstraction is here. Contains BiconomySmartAccountV2 - an API for modular smart account. ### Bug Fixes -* add 10sec timeout limit for a test ([5d12fe7](https://github.com/bcnmy/biconomy-client-sdk/commit/5d12fe7d4b32e5c4628b971d22f6fc9cfcc6b414)) -* avoid sending populated values of gas prices when estimating from bundler ([c58c9fc](https://github.com/bcnmy/biconomy-client-sdk/commit/c58c9fc29ee83978e1a90305e839002431db2b7b)) -* BiconomySmartAccountV2 API Specs ([69a580e](https://github.com/bcnmy/biconomy-client-sdk/commit/69a580ea9e309141b500274aa95e20e24365b522)) -* build errors ([9fb0475](https://github.com/bcnmy/biconomy-client-sdk/commit/9fb047534935b0600bd08a4de7e68fd91a8a089a)) -* comments [#296](https://github.com/bcnmy/biconomy-client-sdk/issues/296) ([55b7376](https://github.com/bcnmy/biconomy-client-sdk/commit/55b7376336886226967b5bec5f11ba3ab750c5b6)) -* estimation without bundler ([5e49473](https://github.com/bcnmy/biconomy-client-sdk/commit/5e49473e7745c2e87e241731ef8ca1f65ee90388)) -* gitInitCode cache issue ([4df3502](https://github.com/bcnmy/biconomy-client-sdk/commit/4df3502204e3c6c0c6faa90ba2c8aa0d6e826e48)) -* lint warning and errors ([2135498](https://github.com/bcnmy/biconomy-client-sdk/commit/2135498896beb54d25add820c1521ffa22d5db7c)) -* unshift error for batch ([4d090e8](https://github.com/bcnmy/biconomy-client-sdk/commit/4d090e8fbc7e7bcc03805d8dd28c738d5c95dae7)) - +- add 10sec timeout limit for a test ([5d12fe7](https://github.com/bcnmy/biconomy-client-sdk/commit/5d12fe7d4b32e5c4628b971d22f6fc9cfcc6b414)) +- avoid sending populated values of gas prices when estimating from bundler ([c58c9fc](https://github.com/bcnmy/biconomy-client-sdk/commit/c58c9fc29ee83978e1a90305e839002431db2b7b)) +- BiconomySmartAccountV2 API Specs ([69a580e](https://github.com/bcnmy/biconomy-client-sdk/commit/69a580ea9e309141b500274aa95e20e24365b522)) +- build errors ([9fb0475](https://github.com/bcnmy/biconomy-client-sdk/commit/9fb047534935b0600bd08a4de7e68fd91a8a089a)) +- comments [#296](https://github.com/bcnmy/biconomy-client-sdk/issues/296) ([55b7376](https://github.com/bcnmy/biconomy-client-sdk/commit/55b7376336886226967b5bec5f11ba3ab750c5b6)) +- estimation without bundler ([5e49473](https://github.com/bcnmy/biconomy-client-sdk/commit/5e49473e7745c2e87e241731ef8ca1f65ee90388)) +- gitInitCode cache issue ([4df3502](https://github.com/bcnmy/biconomy-client-sdk/commit/4df3502204e3c6c0c6faa90ba2c8aa0d6e826e48)) +- lint warning and errors ([2135498](https://github.com/bcnmy/biconomy-client-sdk/commit/2135498896beb54d25add820c1521ffa22d5db7c)) +- unshift error for batch ([4d090e8](https://github.com/bcnmy/biconomy-client-sdk/commit/4d090e8fbc7e7bcc03805d8dd28c738d5c95dae7)) ### Features -* get fee quote or data method in biconomy paymaster ([47748a6](https://github.com/bcnmy/biconomy-client-sdk/commit/47748a6384c2b74e1d9be4d570554098e1ac02e7)) -* update responses to support calculateGasLimits flag + update interfaces ([55bbd38](https://github.com/bcnmy/biconomy-client-sdk/commit/55bbd38b4ef8acaf8da1d52e36846557b134aba4)) -* using hybrid paymaster interface ([5fc56a7](https://github.com/bcnmy/biconomy-client-sdk/commit/5fc56a7db2de4a3f4bb87cd4d75584e79010b206)) - - - - +- get fee quote or data method in biconomy paymaster ([47748a6](https://github.com/bcnmy/biconomy-client-sdk/commit/47748a6384c2b74e1d9be4d570554098e1ac02e7)) +- update responses to support calculateGasLimits flag + update interfaces ([55bbd38](https://github.com/bcnmy/biconomy-client-sdk/commit/55bbd38b4ef8acaf8da1d52e36846557b134aba4)) +- using hybrid paymaster interface ([5fc56a7](https://github.com/bcnmy/biconomy-client-sdk/commit/5fc56a7db2de4a3f4bb87cd4d75584e79010b206)) ## 3.0.0 (2023-08-28) @@ -66,40 +90,27 @@ VERSION Bump Only. Modular SDK - consists stable version of below updates done in Alphas. - - ## 3.1.1-alpha.0 (2023-08-02) - ### Bug Fixes VERSION Bump Only. - - - - # 3.1.0-alpha.0 (2023-07-24) - ### Bug Fixes -* avoid sending populated values of gas prices when estimating from bundler ([c58c9fc](https://github.com/bcnmy/biconomy-client-sdk/commit/c58c9fc29ee83978e1a90305e839002431db2b7b)) - - - +- avoid sending populated values of gas prices when estimating from bundler ([c58c9fc](https://github.com/bcnmy/biconomy-client-sdk/commit/c58c9fc29ee83978e1a90305e839002431db2b7b)) ## 3.0.0-alpha.0 (2023-07-12) - ### Bug Fixes -* estimation without bundler ([5e49473](https://github.com/bcnmy/biconomy-client-sdk/commit/5e49473e7745c2e87e241731ef8ca1f65ee90388)) -* unshift error for batch ([4d090e8](https://github.com/bcnmy/biconomy-client-sdk/commit/4d090e8fbc7e7bcc03805d8dd28c738d5c95dae7)) - +- estimation without bundler ([5e49473](https://github.com/bcnmy/biconomy-client-sdk/commit/5e49473e7745c2e87e241731ef8ca1f65ee90388)) +- unshift error for batch ([4d090e8](https://github.com/bcnmy/biconomy-client-sdk/commit/4d090e8fbc7e7bcc03805d8dd28c738d5c95dae7)) ### Features -* get fee quote or data method in biconomy paymaster ([47748a6](https://github.com/bcnmy/biconomy-client-sdk/commit/47748a6384c2b74e1d9be4d570554098e1ac02e7)) -* update responses to support calculateGasLimits flag + update interfaces ([55bbd38](https://github.com/bcnmy/biconomy-client-sdk/commit/55bbd38b4ef8acaf8da1d52e36846557b134aba4)) -* using hybrid paymaster interface ([5fc56a7](https://github.com/bcnmy/biconomy-client-sdk/commit/5fc56a7db2de4a3f4bb87cd4d75584e79010b206)) +- get fee quote or data method in biconomy paymaster ([47748a6](https://github.com/bcnmy/biconomy-client-sdk/commit/47748a6384c2b74e1d9be4d570554098e1ac02e7)) +- update responses to support calculateGasLimits flag + update interfaces ([55bbd38](https://github.com/bcnmy/biconomy-client-sdk/commit/55bbd38b4ef8acaf8da1d52e36846557b134aba4)) +- using hybrid paymaster interface ([5fc56a7](https://github.com/bcnmy/biconomy-client-sdk/commit/5fc56a7db2de4a3f4bb87cd4d75584e79010b206)) diff --git a/packages/account/Readme.md b/packages/account/Readme.md index fb8fc3959..0aa74954b 100644 --- a/packages/account/Readme.md +++ b/packages/account/Readme.md @@ -1,85 +1,138 @@ -# installation +# Biconomy SDK -Using `npm` package manager +![Biconomy SDK](https://img.shields.io/badge/Biconomy-SDK-blue.svg) +![TypeScript](https://img.shields.io/badge/-TypeScript-blue) +![Test Coverage](https://img.shields.io/badge/Coverage-79.82%25-green.svg) -```bash -npm i @biconomy/account -``` +## 👋 Introduction -OR +The Biconomy SDK is your all-in-one toolkit for building decentralized applications (dApps) with **ERC4337 Account Abstraction** and **Smart Accounts**. It is designed for seamless user experiences and offers non-custodial solutions for user onboarding, sending transactions (userOps), gas sponsorship and much more. -Using `yarn` package manager +## ⚙️ installation ```bash -yarn add @biconomy/account +npm i @biconomy/account ``` -### Account +## 🛠️ Quickstart -Integrating and deploying Smart Accounts, building and sending user operations is a key offering of any toolkit designed for ERC4337. This package seamlessly integrates the essential features associated with ERC-4337 and simplifies the development of your Dapp's account and transaction rails with added usability features. +```typescript +import { createSmartAccountClient } from "@biconomy/account"; -The account package achieves this by providing a comprehensive set of methods that enable developers to effortlessly create UserOperations. Combined with the sophisticated, developer friendly and scalable infrastructure of Biconomy, it ensures efficient and reliable transmission of these operations across multiple EVM chains. +const smartAccount = await createSmartAccountClient({ + signer: viemWalletOrEthersSigner, + bundlerUrl: "", // From dashboard.biconomy.io + biconomyPaymasterApiKey: "", // From dashboard.biconomy.io +}); -## Smart Account instance configuration +const { wait } = await smartAccount.sendTransaction({ to: "0x...", value: 1 }); -#### BiconomySmartAccount (V1 Smart Account) +const { + receipt: { transactionHash }, + userOpHash, +} = await wait(); +``` -| Key | Description | -| --------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| signer | This signer will be used for signing userOps for any transactions you build. You can supply your your EOA wallet signer | -| chainId | This represents the network your smart wallet transactions will be conducted on. Take a look following Link for supported chain id's | -| rpcUrl | This represents the EVM node RPC URL you'll interact with, adjustable according to your needs. We recommend to use some private node url for efficient userOp building | -| paymaster | you can pass same paymaster instance that you have build in previous step. Alternatively, you can skip this if you are not interested in sponsoring transaction using paymaster | -| | Note: if you don't pass the paymaster instance, your smart account will need funds to pay for transaction fees. | -| bundler | You can pass same bundler instance that you have build in previous step. Alternatively, you can skip this if you are only interested in building userOP | +## 🌟 Features -## Example Usage +- **ERC4337 Account Abstraction**: Simplify user operations and gas payments. +- **Smart Accounts**: Enhance user experience with modular smart accounts. +- **Paymaster Service**: Enable third-party gas sponsorship. +- **Bundler Infrastructure**: Ensure efficient and reliable transaction bundling. -```typescript -// This is how you create BiconomySmartAccount instance in your dapp's +For a step-by-step guide on integrating **ERC4337 Account Abstraction** and **Smart Accounts** into your dApp using the Biconomy SDK, refer to the [official documentation](https://docs.biconomy.io/docs/overview). You can also start with Quick start [here](https://docs.biconomy.io/quickstart). -import { BiconomySmartAccount, BiconomySmartAccountConfig } from "@biconomy/account"; +## 📚 Resources -// Note that paymaster and bundler are optional. You can choose to create new instances of this later and make account API use -const biconomySmartAccountConfig: BiconomySmartAccountConfig = { - signer: wallet.getSigner(), - chainId: ChainId.POLYGON_MAINNET, - rpcUrl: "", - // paymaster: paymaster, // check the README.md section of Paymaster package - // bundler: bundler, // check the README.md section of Bundler package -}; +- [Biconomy Documentation](https://docs.biconomy.io/) +- [Biconomy Dashboard](https://dashboard.biconomy.io) +- [TSDoc](https://bcnmy.github.io/biconomy-client-sdk) -const biconomyAccount = new BiconomySmartAccount(biconomySmartAccountConfig); -const biconomySmartAccount = await biconomyAccount.init(); +## 💼 Example Usages -// native token transfer -// you can create any sort of transaction following same structure -const transaction = { - to: "0x85B51B068bF0fefFEFD817882a14f6F5BDF7fF2E", - data: "0x", - value: ethers.utils.parseEther("0.1"), -}; +### [Initialise the smartAccount](https://bcnmy.github.io/biconomy-client-sdk/functions/createSmartAccountClient.html) -// building partialUserOp -const partialUserOp = await biconomySmartAccount.buildUserOp([transaction]); +| Key | Description | +| -------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------- | +| [signer](https://bcnmy.github.io/biconomy-client-sdk/packages/account/docs/interfaces/SmartAccountSigner.html) | This signer will be used for signing userOps for any transactions you build. Will accept ethers.JsonRpcSigner as well as a viemWallet | +| [biconomyPaymasterApiKey](https://dashboard.biconomy.io) | You can pass in a biconomyPaymasterApiKey necessary for sponsoring transactions (retrieved from the biconomy dashboard) | +| [bundlerUrl](https://dashboard.biconomy.io) | You can pass in a bundlerUrl (retrieved from the biconomy dashboard) for sending transactions | -// using the paymaster package one can populate paymasterAndData to partial userOp. by default it is '0x' +```typescript +import { createSmartAccountClient } from "@biconomy/account"; +import { createWalletClient, http, createPublicClient } from "viem"; +import { privateKeyToAccount, generatePrivateKey } from "viem/accounts"; +import { mainnet as chain } from "viem/chains"; + +const account = privateKeyToAccount(generatePrivateKey()); +const signer = createWalletClient({ account, chain, transport: http() }); + +const smartAccount = await createSmartAccountClient({ + signer, + bundlerUrl, + biconomyPaymasterApiKey, +}); ``` +### [Send some ETH, have gas sponsored](https://bcnmy.github.io/biconomy-client-sdk/classes/BiconomySmartAccountV2.html#sendTransaction) + +| Key | Description | +| --------------------------------------------------------------------------------- | -------------------------------------------------------------- | +| [oneOrManyTx](https://bcnmy.github.io/biconomy-client-sdk/types/Transaction.html) | Submit multiple or one transactions | +| [userOpReceipt](https://bcnmy.github.io/biconomy-client-sdk/types/UserOpReceipt) | Returned information about your tx, receipts, userOpHashes etc | + ```typescript -const userOpResponse = await smartAccount.sendUserOp(partialUserOp); -const transactionDetails = await userOpResponse.wait(); -console.log("transaction details below"); -console.log(transactionDetails); +const oneOrManyTx = { to: "0x...", value: 1 }; + +const { wait } = await smartAccount.sendTransaction(oneOrManyTx, { + mode: PaymasterMode.SPONSORED, +}); + +const { + receipt: { transactionHash }, + userOpHash, +} = await wait(); ``` -Finally we send the userOp and save the value to a variable named userOpResponse and get the transactionDetails after calling `typescript userOpResponse.wait()` +### [Mint two NFTs, pay gas with token](https://bcnmy.github.io/biconomy-client-sdk/classes/BiconomySmartAccountV2.html#getTokenFees) + +| Key | Description | +| -------------------------------------------------------------------------------------------------------- | ------------------------------------------ | +| [buildUseropDto](https://bcnmy.github.io/biconomy-client-sdk/types/BuildUserOpOptions.html) | Options for building a userOp | +| [paymasterServiceData](https://bcnmy.github.io/biconomy-client-sdk/types/PaymasterUserOperationDto.html) | PaymasterOptions set in the buildUseropDto | ```typescript -const transactionDetails = await userOpResponse.wait(); -console.log("transaction details below"); -console.log(transactionDetails); +import { encodeFunctionData, parseAbi } from "viem"; + +const encodedCall = encodeFunctionData({ + abi: parseAbi(["function safeMint(address to) public"]), + functionName: "safeMint", + args: ["0x..."], +}); + +const tx = { + to: nftAddress, + data: encodedCall, +}; +const oneOrManyTx = [tx, tx]; // Mint twice +const paymasterServiceData = { + mode: PaymasterMode.ERC20, + preferredToken: "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", // USDC +}; +const buildUseropDto = { paymasterServiceData }; + +const { wait } = await smartAccount.sendTransaction(oneOrManyTx, buildUseropDto); + +const { + receipt: { transactionHash }, + userOpHash, +} = await wait(); ``` -#### BiconomySmartAccount (V2 Smart Account aka Modular Smart Account) +## 🤝 Contributing + +Community contributions are welcome! For guidelines on contributing, please read our [contribution guidelines](./CONTRIBUTING.md). + +## 📜 License +This project is licensed under the MIT License. See the [LICENSE.md](./LICENSE.md) file for details. diff --git a/packages/account/package.json b/packages/account/package.json index 1dfa29482..07844719d 100644 --- a/packages/account/package.json +++ b/packages/account/package.json @@ -1,9 +1,19 @@ { "name": "@biconomy/account", - "version": "3.1.3", + "version": "4.0.0", "description": "This package provides apis for ERC-4337 based smart account implementations", - "main": "./dist/src/index.js", - "typings": "./dist/src/index.d.ts", + "main": "./dist/cjs/index.js", + "module": "./dist/esm/index.js", + "types": "./dist/types/index.d.ts", + "typings": "./dist/types/index.d.ts", + "exports": { + ".": { + "import": "./dist/esm/index.js", + "types": "./dist/types/index.d.ts", + "default": "./dist/cjs/index.js" + }, + "./package.json": "./package.json" + }, "keywords": [ "Ethereum", "Smart Account", @@ -14,17 +24,28 @@ "SDK" ], "scripts": { + "docs": "typedoc", "unbuild": "rimraf dist *.tsbuildinfo", - "build": "rimraf dist && tsc", + "build:watch": "yarn build:tsc --watch", + "dist:minify": "esbuild ./dist/esm/**/*.js ./dist/esm/*.js --minify --outdir=./dist/esm --bundle=false --allow-overwrite", + "build": "yarn unbuild && yarn build:tsc", + "build:esbuild": "yarn build:esbuild:cjs && yarn build:esbuild:esm && yarn build:typ", + "build:tsc:cjs": "tsc --project tsconfig.build.json --module commonjs --outDir ./dist/cjs --removeComments --verbatimModuleSyntax false && echo > ./dist/cjs/package.json '{\"type\":\"commonjs\"}'", + "build:tsc:esm": "tsc --project tsconfig.build.json --module esnext --outDir ./dist/esm --removeComments && echo > ./dist/esm/package.json '{\"type\":\"module\"}'", + "build:esbuild:cjs": "node .esbuild.js CJS && echo > ./dist/cjs/package.json '{\"type\":\"commonjs\"}'", + "build:esbuild:esm": "node .esbuild.js ESM && echo > ./dist/esm/package.json '{\"type\":\"module\"}'", + "build:typ": "tsc --project tsconfig.build.json --module esnext --declarationDir ./dist/types --emitDeclarationOnly --declaration --declarationMap", + "build:tsc": "yarn build:tsc:cjs && yarn build:tsc:esm && yarn build:typ && yarn dist:minify", "test:concurrently": "concurrently -k --success first 'yarn start:ganache' 'yarn test'", "test:cov": "jest --coverage", "test": "jest tests/**/*.spec.ts --runInBand", "test:run": "yarn test:concurrently", "start:ganache": "ganache -m 'direct buyer cliff train rice spirit census refuse glare expire innocent quote'", "format": "prettier --write \"{src,tests}/**/*.ts\"", - "lint": "tslint -p tsconfig.json" + "lint": "tslint -p tsconfig.json", + "docs:deploy": "yarn docs && gh-pages -d docs" }, - "author": "talhamalik883 ", + "author": "Biconomy", "license": "MIT", "files": [ "dist/*", @@ -34,24 +55,21 @@ "access": "public" }, "devDependencies": { + "@types/node": "^20.11.10", + "esbuild": "^0.19.11", + "esbuild-plugin-tsc": "^0.4.0", + "gh-pages": "^6.1.1", "nock": "^13.2.9", - "viem": "^1.19.11" + "npm-dts": "^1.3.12", + "typedoc": "^0.25.7", + "lru-cache": "^10.0.1" }, "dependencies": { - "@account-abstraction/contracts": "^0.6.0", - "@account-abstraction/utils": "^0.4.0", - "@alchemy/aa-core": "^1.2.2", - "@biconomy-devx/account-contracts-v2": "npm:@biconomy-devx/account-contracts-v2@^1.0.0", - "@biconomy/bundler": "^3.1.3", - "@biconomy/common": "^3.1.3", - "@biconomy/core-types": "^3.1.3", - "@biconomy/modules": "^3.1.3", - "@biconomy/node-client": "^3.1.3", - "@biconomy/paymaster": "^3.1.3", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/providers": "^5.7.2", - "ethers": "^5.7.0", - "loglevel": "^1.8.1", - "lru-cache": "^10.0.1" + "@alchemy/aa-core": "3.0.0-alpha.4", + "@biconomy/bundler": "4.0.0", + "@biconomy/common": "4.0.0", + "@biconomy/modules": "4.0.0", + "@biconomy/paymaster": "4.0.0", + "viem": "^2.7.3" } } diff --git a/packages/account/src/BaseSmartAccount.ts b/packages/account/src/BaseSmartAccount.ts deleted file mode 100644 index 90bb0ecff..000000000 --- a/packages/account/src/BaseSmartAccount.ts +++ /dev/null @@ -1,481 +0,0 @@ -import { JsonRpcProvider, Provider } from "@ethersproject/providers"; -import { BigNumber, BigNumberish, BytesLike, ethers, Bytes } from "ethers"; -import { IBaseSmartAccount } from "./interfaces/IBaseSmartAccount"; -import { defaultAbiCoder, keccak256 } from "ethers/lib/utils"; -import { UserOperation, ChainId } from "@biconomy/core-types"; -import { calcPreVerificationGas, DefaultGasLimits } from "./utils/Preverificaiton"; -import { NotPromise, packUserOp, Logger, RPC_PROVIDER_URLS, isNullOrUndefined } from "@biconomy/common"; -import { Bundler, IBundler, UserOpResponse } from "@biconomy/bundler"; -import { IPaymaster, PaymasterAndDataResponse } from "@biconomy/paymaster"; -import { SendUserOpParams } from "@biconomy/modules"; -import { SponsorUserOperationDto, BiconomyPaymaster, PaymasterMode, IHybridPaymaster } from "@biconomy/paymaster"; -import { BaseSmartAccountConfig, EstimateUserOpGasParams, TransactionDetailsForUserOp } from "./utils/Types"; -import { GasOverheads } from "./utils/Preverificaiton"; -import { EntryPoint, EntryPoint__factory } from "@account-abstraction/contracts"; -import { DEFAULT_ENTRYPOINT_ADDRESS, DefaultGasLimit } from "./utils/Constants"; -import { LRUCache } from "lru-cache"; - -type UserOperationKey = keyof UserOperation; - -export abstract class BaseSmartAccount implements IBaseSmartAccount { - bundler?: IBundler; // httpRpcClient - - paymaster?: IPaymaster; // paymasterAPI - - overheads?: Partial; - - entryPointAddress!: string; - - accountAddress?: string; - - // owner?: Signer // owner is not mandatory for some account implementations - index: number; - - chainId?: ChainId; - - provider: Provider; - - // entryPoint connected to "zero" address. allowed to make static calls (e.g. to getSenderAddress) - private readonly entryPoint!: EntryPoint; - - private isContractDeployedCache = new LRUCache({ - max: 500, - }); - - constructor(_smartAccountConfig: BaseSmartAccountConfig) { - this.index = _smartAccountConfig.index ?? 0; - this.overheads = _smartAccountConfig.overheads; - this.entryPointAddress = _smartAccountConfig.entryPointAddress ?? DEFAULT_ENTRYPOINT_ADDRESS; - this.accountAddress = _smartAccountConfig.accountAddress; - - this.chainId = _smartAccountConfig.chainId; - - if (_smartAccountConfig.bundlerUrl) { - this.bundler = new Bundler({ - bundlerUrl: _smartAccountConfig.bundlerUrl, - chainId: _smartAccountConfig.chainId, - }); - } else { - this.bundler = _smartAccountConfig.bundler; - } - - if (_smartAccountConfig.paymaster) { - this.paymaster = _smartAccountConfig.paymaster; - } - - this.provider = _smartAccountConfig.provider ?? new JsonRpcProvider(RPC_PROVIDER_URLS[this.chainId]); - - // Create an instance of the EntryPoint contract using the provided address and provider (facory "connect" contract address) - // Then, set the transaction's sender ("from" address) to the zero address (AddressZero). (contract "connect" from address) - this.entryPoint = EntryPoint__factory.connect(this.entryPointAddress, this.provider).connect(ethers.constants.AddressZero); - } - - async init(): Promise { - if (this.entryPointAddress === DEFAULT_ENTRYPOINT_ADDRESS) return this; - if ((await this.provider.getCode(this.entryPointAddress)) === "0x") { - throw new Error(`EntryPoint not deployed at ${this.entryPointAddress} at chainId ${this.chainId}}`); - } - return this; - } - - setEntryPointAddress(entryPointAddress: string): void { - this.entryPointAddress = entryPointAddress; - } - - validateUserOp(userOp: Partial, requiredFields: UserOperationKey[]): boolean { - for (const field of requiredFields) { - if (isNullOrUndefined(userOp[field])) { - throw new Error(`${String(field)} is missing in the UserOp`); - } - } - return true; - } - - isProviderDefined(): boolean { - if (!this.provider) throw new Error("Provider is undefined"); - - return true; - } - - /** - * return the value to put into the "initCode" field, if the contract is not yet deployed. - * this value holds the "factory" address, followed by this account's information - */ - abstract getAccountInitCode(): Promise; - - /** - * return current account's nonce. - */ - abstract getNonce(): Promise; - - /** - * encode the call from entryPoint through our account to the target contract. - * @param to - * @param value - * @param data - */ - abstract encodeExecute(_to: string, _value: BigNumberish, _data: BytesLike): Promise; - - /** - * encode the batch call from entryPoint through our account to the target contract. - * @param to - * @param value - * @param data - */ - abstract encodeExecuteBatch(_to: Array, _value: Array, _data: Array): Promise; - - /** - * sign a userOp's hash (userOpHash). - * @param userOpHash - */ - abstract signUserOpHash(_userOpHash: string): Promise; - - abstract signMessage(_message: Bytes | string): Promise; - - /** - * get dummy signature for userOp - */ - abstract getDummySignature(): Promise; - - /** - * Sign the filled userOp. - * @param userOp the UserOperation to sign (with signature field ignored) - */ - async signUserOp(userOp: Partial): Promise { - const requiredFields: UserOperationKey[] = [ - "sender", - "nonce", - "initCode", - "callData", - "callGasLimit", - "verificationGasLimit", - "preVerificationGas", - "maxFeePerGas", - "maxPriorityFeePerGas", - "paymasterAndData", - ]; - this.validateUserOp(userOp, requiredFields); - const userOpHash = await this.getUserOpHash(userOp); - let signature = await this.signUserOpHash(userOpHash); - - // Some signers do not return signed data with 0x prefix. make sure the v value is 27/28 instead of 0/1 - // Also split sig and add +27 to v is v is only 0/1. then stitch it back - - // Note: Should only be applied for ECDSA k1 signatures - const potentiallyIncorrectV = parseInt(signature.slice(-2), 16); - if (![27, 28].includes(potentiallyIncorrectV)) { - const correctV = potentiallyIncorrectV + 27; - signature = signature.slice(0, -2) + correctV.toString(16); - } - if (signature.slice(0, 2) !== "0x") { - signature = "0x" + signature; - } - - userOp.signature = signature; - return userOp as UserOperation; - } - - /** - * - * @param userOp - * @description This function call will take 'unsignedUserOp' as an input, sign it with the owner key, and send it to the bundler. - * @returns Promise - */ - async sendUserOp(userOp: Partial): Promise { - Logger.log("userOp received in base account ", userOp); - delete userOp.signature; - const userOperation = await this.signUserOp(userOp); - const bundlerResponse = await this.sendSignedUserOp(userOperation); - return bundlerResponse; - } - - /** - * - * @param userOp - * @description This function call will take 'signedUserOp' as input and send it to the bundler - * @returns - */ - async sendSignedUserOp(userOp: UserOperation, params?: SendUserOpParams): Promise { - const requiredFields: UserOperationKey[] = [ - "sender", - "nonce", - "initCode", - "callData", - "callGasLimit", - "verificationGasLimit", - "preVerificationGas", - "maxFeePerGas", - "maxPriorityFeePerGas", - "paymasterAndData", - "signature", - ]; - this.validateUserOp(userOp, requiredFields); - Logger.log("userOp validated"); - if (!this.bundler) throw new Error("Bundler is not provided"); - Logger.log("userOp being sent to the bundler", userOp); - const bundlerResponse = await this.bundler.sendUserOp(userOp, params?.simulationType); - return bundlerResponse; - } - - async calculateUserOpGasValues(userOp: Partial): Promise> { - if (!this.provider) throw new Error("Provider is not present for making rpc calls"); - let feeData = null; - - if ( - userOp.maxFeePerGas === undefined || - userOp.maxFeePerGas === null || - userOp.maxPriorityFeePerGas === undefined || - userOp.maxPriorityFeePerGas === null - ) { - feeData = await this.provider.getFeeData(); - } - - if (userOp.maxFeePerGas === undefined || userOp.maxFeePerGas === null) { - userOp.maxFeePerGas = feeData?.maxFeePerGas ?? feeData?.gasPrice ?? (await this.provider.getGasPrice()); - } - - if (userOp.maxPriorityFeePerGas === undefined || userOp.maxPriorityFeePerGas === null) { - userOp.maxPriorityFeePerGas = feeData?.maxPriorityFeePerGas ?? feeData?.gasPrice ?? (await this.provider.getGasPrice()); - } - if (userOp.initCode) userOp.verificationGasLimit = userOp.verificationGasLimit ?? (await this.getVerificationGasLimit(userOp.initCode)); - userOp.callGasLimit = - userOp.callGasLimit ?? - (await this.provider.estimateGas({ - from: this.entryPointAddress, - to: userOp.sender, - data: userOp.callData, - })); - userOp.preVerificationGas = userOp.preVerificationGas ?? (await this.getPreVerificationGas(userOp)); - return userOp; - } - - async estimateUserOpGas(params: EstimateUserOpGasParams): Promise> { - let userOp = params.userOp; - const { overrides, skipBundlerGasEstimation, paymasterServiceData } = params; - const requiredFields: UserOperationKey[] = ["sender", "nonce", "initCode", "callData"]; - this.validateUserOp(userOp, requiredFields); - - let finalUserOp = userOp; - const skipBundlerCall = skipBundlerGasEstimation ?? true; - // Override gas values in userOp if provided in overrides params - if (overrides) { - userOp = { ...userOp, ...overrides }; - } - - Logger.log("userOp in estimation", userOp); - - if (skipBundlerCall) { - if (this.paymaster && this.paymaster instanceof BiconomyPaymaster) { - if (isNullOrUndefined(userOp.maxFeePerGas) || isNullOrUndefined(userOp.maxPriorityFeePerGas)) { - throw new Error("maxFeePerGas and maxPriorityFeePerGas are required for skipBundlerCall mode"); - } - if (paymasterServiceData?.mode === PaymasterMode.SPONSORED) { - // Making call to paymaster to get gas estimations for userOp - const { callGasLimit, verificationGasLimit, preVerificationGas, paymasterAndData } = await ( - this.paymaster as IHybridPaymaster - ).getPaymasterAndData(userOp, paymasterServiceData); - if (paymasterAndData === "0x" && (callGasLimit === undefined || verificationGasLimit === undefined || preVerificationGas === undefined)) { - throw new Error("Since you intend to use sponsorship paymaster, please check and make sure policies are set on the dashboard"); - } - finalUserOp.verificationGasLimit = verificationGasLimit ?? userOp.verificationGasLimit; - finalUserOp.callGasLimit = callGasLimit ?? userOp.callGasLimit; - finalUserOp.preVerificationGas = preVerificationGas ?? userOp.preVerificationGas; - finalUserOp.paymasterAndData = paymasterAndData ?? userOp.paymasterAndData; - } else { - // use dummy values for gas limits as fee quote call will ignore this later. - finalUserOp.callGasLimit = DefaultGasLimit.callGasLimit; - finalUserOp.verificationGasLimit = DefaultGasLimit.verificationGasLimit; - finalUserOp.preVerificationGas = DefaultGasLimit.preVerificationGas; - } - } else { - { - Logger.warn("Skipped paymaster call. If you are using paymasterAndData, generate data externally"); - finalUserOp = await this.calculateUserOpGasValues(userOp); - finalUserOp.paymasterAndData = "0x"; - } - } - } else { - if (!this.bundler) throw new Error("Bundler is not provided"); - delete userOp.maxFeePerGas; - delete userOp.maxPriorityFeePerGas; - // Making call to bundler to get gas estimations for userOp - const { callGasLimit, verificationGasLimit, preVerificationGas, maxFeePerGas, maxPriorityFeePerGas } = - await this.bundler.estimateUserOpGas(userOp); - // if neither user sent gas fee nor the bundler, estimate gas from provider - if ( - isNullOrUndefined(userOp.maxFeePerGas) && - isNullOrUndefined(userOp.maxPriorityFeePerGas) && - (isNullOrUndefined(maxFeePerGas) || isNullOrUndefined(maxPriorityFeePerGas)) - ) { - const feeData = await this.provider.getFeeData(); - finalUserOp.maxFeePerGas = feeData.maxFeePerGas ?? feeData.gasPrice ?? (await this.provider.getGasPrice()); - finalUserOp.maxPriorityFeePerGas = feeData.maxPriorityFeePerGas ?? feeData.gasPrice ?? (await this.provider.getGasPrice()); - } else { - finalUserOp.maxFeePerGas = maxFeePerGas ?? userOp.maxFeePerGas; - finalUserOp.maxPriorityFeePerGas = maxPriorityFeePerGas ?? userOp.maxPriorityFeePerGas; - } - finalUserOp.verificationGasLimit = verificationGasLimit ?? userOp.verificationGasLimit; - finalUserOp.callGasLimit = callGasLimit ?? userOp.callGasLimit; - finalUserOp.preVerificationGas = preVerificationGas ?? userOp.preVerificationGas; - finalUserOp.paymasterAndData = "0x"; - } - return finalUserOp; - } - - // Would only be used if paymaster is attached - async getPaymasterAndData(userOp: Partial): Promise { - if (this.paymaster) { - const paymasterAndDataResponse: PaymasterAndDataResponse = await this.paymaster.getPaymasterAndData(userOp); - return paymasterAndDataResponse.paymasterAndData; - } - return "0x"; - } - - async isAccountDeployed(address: string): Promise { - if (this.isContractDeployedCache.get(address)) { - return true; - } - - this.isProviderDefined(); - let isDeployed = false; - const contractCode = await this.provider.getCode(address); - if (contractCode.length > 2) { - this.isContractDeployedCache.set(address, true); - isDeployed = true; - } else { - isDeployed = false; - } - return isDeployed; - } - - /** - * calculate the account address even before it is deployed - */ - async getCounterFactualAddress(): Promise { - const initCode = this.getAccountInitCode(); - // use entryPoint to query account address (factory can provide a helper method to do the same, but - // this method attempts to be generic - try { - await this.entryPoint.callStatic.getSenderAddress(initCode); - } catch (e: any) { - if (e.errorArgs == null) { - throw e; - } - return e.errorArgs.sender; - } - throw new Error("must handle revert"); - } - - /** - * return initCode value to into the UserOp. - * (either deployment code, or empty hex if contract already deployed) - */ - async getInitCode(): Promise { - if (await this.isAccountDeployed(await this.getAccountAddress())) { - return "0x"; - } - return this.getAccountInitCode(); - } - - async getPreVerificationGas(userOp: Partial): Promise { - return calcPreVerificationGas(userOp); - } - - async getVerificationGasLimit(initCode: BytesLike): Promise { - // Verification gas should be max(initGas(wallet deployment) + validateUserOp + validatePaymasterUserOp , postOp) - - const initGas = await this.estimateCreationGas(initCode as string); - const validateUserOpGas = BigNumber.from(DefaultGasLimits.validatePaymasterUserOpGas + DefaultGasLimits.validateUserOpGas); - const postOpGas = BigNumber.from(DefaultGasLimits.postOpGas); - - let verificationGasLimit = BigNumber.from(validateUserOpGas).add(initGas); - - if (BigNumber.from(postOpGas).gt(verificationGasLimit)) { - verificationGasLimit = postOpGas; - } - return verificationGasLimit; - } - - /** - * return the account's address. - * this value is valid even before deploying the contract. - */ - async getAccountAddress(): Promise { - if (this.accountAddress == null) { - // means it needs deployment - this.accountAddress = await this.getCounterFactualAddress(); - } - return this.accountAddress; - } - - async estimateCreationGas(initCode?: string): Promise { - if (initCode == null || initCode === "0x") return 0; - const deployerAddress = initCode.substring(0, 42); - const deployerCallData = "0x" + initCode.substring(42); - return this.provider.estimateGas({ to: deployerAddress, data: deployerCallData }); - } - - /** - * get the transaction that has this userOpHash mined, or null if not found - * @param userOpHash returned by sendUserOpToBundler (or by getUserOpHash..) - * @param timeout stop waiting after this timeout - * @param interval time to wait between polls. - * @return the transactionHash this userOp was mined, or null if not found. - */ - async getUserOpReceipt(userOpHash: string, timeout = 30000, interval = 5000): Promise { - const endtime = Date.now() + timeout; - while (Date.now() < endtime) { - const events = await this.entryPoint.queryFilter(this.entryPoint.filters.UserOperationEvent(userOpHash)); - if (events.length > 0) { - return events[0].transactionHash; - } - await new Promise((resolve) => setTimeout(resolve, interval)); - } - return null; - } - - async getUserOpHash(userOp: Partial): Promise { - const userOpHash = keccak256(packUserOp(userOp, true)); - const enc = defaultAbiCoder.encode(["bytes32", "address", "uint256"], [userOpHash, this.entryPoint.address, this.chainId]); - return keccak256(enc); - } - - /** - * ABI-encode a user operation. used for calldata cost estimation - */ - packUserOp(userOp: NotPromise): string { - return packUserOp(userOp, false); - } - - async encodeUserOpCallDataAndGasLimit(detailsForUserOp: TransactionDetailsForUserOp): Promise<{ callData: string; callGasLimit: BigNumber }> { - function parseNumber(a: any): BigNumber | null { - if (a == null || a === "") return null; - return BigNumber.from(a.toString()); - } - - const value = parseNumber(detailsForUserOp.value) ?? BigNumber.from(0); - const callData = await this.encodeExecute(detailsForUserOp.target, value, detailsForUserOp.data); - - const callGasLimit = - parseNumber(detailsForUserOp.gasLimit) ?? - (await this.provider.estimateGas({ - from: this.entryPointAddress, - to: this.getAccountAddress(), - data: callData, - })); - - return { - callData, - callGasLimit, - }; - } - - /** - * helper method: create and sign a user operation. - * @param info transaction details for the userOp - */ - async createSignedUserOp(info: TransactionDetailsForUserOp): Promise { - Logger.log("createSignedUserOp called with info", info); - throw new Error("Not implemented. Please use buildUserOp/buildUserOperation in account implementation"); - } -} diff --git a/packages/account/src/BiconomySmartAccount.ts b/packages/account/src/BiconomySmartAccount.ts deleted file mode 100644 index 3307856b7..000000000 --- a/packages/account/src/BiconomySmartAccount.ts +++ /dev/null @@ -1,544 +0,0 @@ -import { JsonRpcProvider } from "@ethersproject/providers"; -import { ethers, BigNumberish, BytesLike, BigNumber } from "ethers"; -import { SmartAccount } from "./SmartAccount"; -import { - Logger, - NODE_CLIENT_URL, - RPC_PROVIDER_URLS, - SmartAccountFactory_v100, - SmartAccount_v200, - getEntryPointContract, - getSAFactoryContract, - getSAProxyContract, - isNullOrUndefined, -} from "@biconomy/common"; -import { BiconomySmartAccountConfig, Overrides, BiconomyTokenPaymasterRequest, InitilizationData } from "./utils/Types"; -import { UserOperation, Transaction, SmartAccountType } from "@biconomy/core-types"; -import NodeClient from "@biconomy/node-client"; -import INodeClient from "@biconomy/node-client"; -import { IHybridPaymaster, BiconomyPaymaster, SponsorUserOperationDto } from "@biconomy/paymaster"; -import { DEFAULT_ECDSA_OWNERSHIP_MODULE, ECDSAOwnershipValidationModule } from "@biconomy/modules"; -import { IBiconomySmartAccount } from "./interfaces/IBiconomySmartAccount"; -import { - ISmartAccount, - SupportedChainsResponse, - BalancesResponse, - BalancesDto, - UsdBalanceResponse, - SmartAccountByOwnerDto, - SmartAccountsResponse, - SCWTransactionResponse, -} from "@biconomy/node-client"; -import { - ENTRYPOINT_ADDRESSES, - BICONOMY_FACTORY_ADDRESSES, - BICONOMY_IMPLEMENTATION_ADDRESSES, - DEFAULT_ENTRYPOINT_ADDRESS, - DEFAULT_BICONOMY_IMPLEMENTATION_ADDRESS, - BICONOMY_IMPLEMENTATION_ADDRESSES_BY_VERSION, -} from "./utils/Constants"; -import { Signer } from "ethers"; - -export class BiconomySmartAccount extends SmartAccount implements IBiconomySmartAccount { - private factory!: SmartAccountFactory_v100; - - private nodeClient: INodeClient; - - private accountIndex!: number; - - private address!: string; - - private smartAccountInfo!: ISmartAccount; - - private _isInitialised!: boolean; - - constructor(readonly biconomySmartAccountConfig: BiconomySmartAccountConfig) { - const { signer, rpcUrl, entryPointAddress, bundler, paymaster, chainId, nodeClientUrl } = biconomySmartAccountConfig; - - const _entryPointAddress = entryPointAddress ?? DEFAULT_ENTRYPOINT_ADDRESS; - super({ - bundler, - entryPointAddress: _entryPointAddress, - }); - const _rpcUrl = rpcUrl ?? RPC_PROVIDER_URLS[chainId]; - - if (!_rpcUrl) { - throw new Error( - `Chain Id ${chainId} is not supported. Please refer to the following link for supported chains list https://docs.biconomy.io/build-with-biconomy-sdk/gasless-transactions#supported-chains`, - ); - } - this.provider = new JsonRpcProvider(_rpcUrl); - this.nodeClient = new NodeClient({ txServiceUrl: nodeClientUrl ?? NODE_CLIENT_URL }); - this.signer = signer; - - if (paymaster) { - this.paymaster = paymaster; - } - if (bundler) this.bundler = bundler; - } - - /** - * @description This function will initialise BiconomyAccount class state - * @returns Promise - */ - async init(initilizationData?: InitilizationData): Promise { - try { - let _accountIndex, signerAddress; - if (initilizationData) { - _accountIndex = initilizationData.accountIndex; - signerAddress = initilizationData.signerAddress; - } - - if (!_accountIndex) _accountIndex = 0; - this.isProviderDefined(); - this.isSignerDefined(); - - if (signerAddress) { - this.owner = signerAddress; - } else { - this.owner = await this.signer.getAddress(); - } - this.chainId = await this.provider.getNetwork().then((net) => net.chainId); - await this.initializeAccountAtIndex(_accountIndex); - this._isInitialised = true; - } catch (error) { - Logger.error(`Failed to call init: ${error}`); - throw error; - } - - return this; - } - - async attachSigner(_signer: Signer): Promise { - try { - this.signer = _signer; - this.owner = await this.signer.getAddress(); - } catch (error) { - throw new Error(`Failed to get signer address`); - } - } - - private isInitialized(): boolean { - if (!this._isInitialised) - throw new Error( - "BiconomySmartAccount is not initialized. Please call init() on BiconomySmartAccount instance before interacting with any other function", - ); - return true; - } - - private setProxyContractState(): void { - if (!BICONOMY_IMPLEMENTATION_ADDRESSES[this.smartAccountInfo.implementationAddress]) - throw new Error( - "Could not find attached implementation address against your smart account. Please raise an issue on https://github.com/bcnmy/biconomy-client-sdk for further investigation.", - ); - const proxyInstanceDto = { - smartAccountType: SmartAccountType.BICONOMY, - version: BICONOMY_IMPLEMENTATION_ADDRESSES[this.smartAccountInfo.implementationAddress], - contractAddress: this.address, - provider: this.provider, - }; - this.proxy = getSAProxyContract(proxyInstanceDto); - } - - private setEntryPointContractState(): void { - const _entryPointAddress = this.smartAccountInfo.entryPointAddress; - this.setEntryPointAddress(_entryPointAddress); - if (!ENTRYPOINT_ADDRESSES[_entryPointAddress]) - throw new Error( - "Could not find attached entrypoint address against your smart account. Please raise an issue on https://github.com/bcnmy/biconomy-client-sdk for further investigation.", - ); - const entryPointInstanceDto = { - smartAccountType: SmartAccountType.BICONOMY, - version: ENTRYPOINT_ADDRESSES[_entryPointAddress], - contractAddress: _entryPointAddress, - provider: this.provider, - }; - this.entryPoint = getEntryPointContract(entryPointInstanceDto); - } - - private setFactoryContractState(): void { - const _factoryAddress = this.smartAccountInfo.factoryAddress; - if (!BICONOMY_FACTORY_ADDRESSES[_factoryAddress]) - throw new Error( - "Could not find attached factory address against your smart account. Please raise an issue on https://github.com/bcnmy/biconomy-client-sdk for further investigation.", - ); - const factoryInstanceDto = { - smartAccountType: SmartAccountType.BICONOMY, - version: BICONOMY_FACTORY_ADDRESSES[_factoryAddress], - contractAddress: _factoryAddress, - provider: this.provider, - }; - this.factory = getSAFactoryContract(factoryInstanceDto) as SmartAccountFactory_v100; - } - - private async setContractsState(): Promise { - this.setProxyContractState(); - this.setEntryPointContractState(); - this.setFactoryContractState(); - } - - async initializeAccountAtIndex(accountIndex: number): Promise { - this.accountIndex = accountIndex; - this.address = await this.getSmartAccountAddress(accountIndex); - await this.setContractsState(); - await this.setInitCode(this.accountIndex); - } - - async getSmartAccountAddress(accountIndex = 0): Promise { - try { - this.isSignerDefined(); - let smartAccountsList: ISmartAccount[] = ( - await this.getSmartAccountsByOwner({ - chainId: this.chainId, - owner: this.owner, - index: accountIndex, - }) - ).data; - if (!smartAccountsList) - throw new Error( - "Failed to get smart account address. Please raise an issue on https://github.com/bcnmy/biconomy-client-sdk for further investigation.", - ); - smartAccountsList = smartAccountsList.filter((smartAccount: ISmartAccount) => { - return accountIndex === smartAccount.index; - }); - if (smartAccountsList.length === 0) - throw new Error( - "Failed to get smart account address. Please raise an issue on https://github.com/bcnmy/biconomy-client-sdk for further investigation.", - ); - this.smartAccountInfo = smartAccountsList[0]; - return this.smartAccountInfo.smartAccountAddress; - } catch (error) { - Logger.error(`Failed to get smart account address: ${error}`); - throw error; - } - } - - private async setInitCode(accountIndex = 0): Promise { - this.initCode = ethers.utils.hexConcat([ - this.factory.address, - this.factory.interface.encodeFunctionData("deployCounterFactualAccount", [this.owner, ethers.BigNumber.from(accountIndex)]), - ]); - return this.initCode; - } - - /** - * @description an overrided function to showcase overriding example - * @returns - */ - nonce(): Promise { - this.isProxyDefined(); - return this.proxy.nonce(); - } - - /** - * - * @param to { target } address of transaction - * @param value represents amount of native tokens - * @param data represent data associated with transaction - * @returns - */ - getExecuteCallData(to: string, value: BigNumberish, data: BytesLike): string { - this.isInitialized(); - this.isProxyDefined(); - const executeCallData = this.proxy.interface.encodeFunctionData("executeCall", [to, value, data]); - return executeCallData; - } - - /** - * - * @param to { target } array of addresses in transaction - * @param value represents array of amount of native tokens associated with each transaction - * @param data represent array of data associated with each transaction - * @returns - */ - getExecuteBatchCallData(to: Array, value: Array, data: Array): string { - this.isInitialized(); - this.isProxyDefined(); - const executeBatchCallData = this.proxy.interface.encodeFunctionData("executeBatchCall", [to, value, data]); - return executeBatchCallData; - } - - getDummySignature(): string { - return "0x73c3ac716c487ca34bb858247b5ccf1dc354fbaabdd089af3b2ac8e78ba85a4959a2d76250325bd67c11771c31fccda87c33ceec17cc0de912690521bb95ffcb1b"; - } - - getDummyPaymasterData(): string { - return "0x"; - } - - private async getNonce(): Promise { - let nonce = BigNumber.from(0); - try { - nonce = await this.nonce(); - } catch (error) { - // Not throwing this error as nonce would be 0 if this.nonce() throw exception, which is expected flow for undeployed account - Logger.log("Error while getting nonce for the account. This is expected for undeployed accounts set nonce to 0"); - } - return nonce; - } - - private async getGasFeeValues( - overrides: Overrides | undefined, - skipBundlerGasEstimation: boolean | undefined, - ): Promise<{ maxFeePerGas?: BigNumberish | undefined; maxPriorityFeePerGas?: BigNumberish | undefined }> { - const gasFeeValues = { - maxFeePerGas: overrides?.maxFeePerGas, - maxPriorityFeePerGas: overrides?.maxPriorityFeePerGas, - }; - try { - if (this.bundler && !gasFeeValues.maxFeePerGas && !gasFeeValues.maxPriorityFeePerGas && (skipBundlerGasEstimation ?? true)) { - const gasFeeEstimation = await this.bundler.getGasFeeValues(); - gasFeeValues.maxFeePerGas = gasFeeEstimation.maxFeePerGas; - gasFeeValues.maxPriorityFeePerGas = gasFeeEstimation.maxPriorityFeePerGas; - } - return gasFeeValues; - } catch (error: any) { - Logger.error("Error while getting gasFeeValues from bundler. Provided bundler might not have getGasFeeValues endpoint", error); - return gasFeeValues; - } - } - - async buildUserOp( - transactions: Transaction[], - overrides?: Overrides, - skipBundlerGasEstimation?: boolean, - paymasterServiceData?: SponsorUserOperationDto, - ): Promise> { - this.isInitialized(); - const to = transactions.map((element: Transaction) => element.to); - const data = transactions.map((element: Transaction) => element.data ?? "0x"); - const value = transactions.map((element: Transaction) => element.value ?? BigNumber.from("0")); - this.isProxyDefined(); - - const [nonce, gasFeeValues] = await Promise.all([this.getNonce(), this.getGasFeeValues(overrides, skipBundlerGasEstimation)]); - - let callData = ""; - if (transactions.length === 1) { - callData = this.getExecuteCallData(to[0], value[0], data[0]); - } else { - callData = this.getExecuteBatchCallData(to, value, data); - } - - let isDeployed = true; - - if (nonce.eq(0)) { - isDeployed = await this.isAccountDeployed(this.address); - } - - let userOp: Partial = { - sender: this.address, - nonce, - initCode: !isDeployed ? this.initCode : "0x", - callData: callData, - maxFeePerGas: gasFeeValues.maxFeePerGas || undefined, - maxPriorityFeePerGas: gasFeeValues.maxPriorityFeePerGas || undefined, - signature: this.getDummySignature(), - }; - - // Note: Can change the default behaviour of calling estimations using bundler/local - userOp = await this.estimateUserOpGas({ userOp, overrides, skipBundlerGasEstimation, paymasterServiceData }); - userOp.paymasterAndData = userOp.paymasterAndData ?? "0x"; - Logger.log("UserOp after estimation ", userOp); - - return userOp; - } - - private validateUserOpAndRequest(userOp: Partial, tokenPaymasterRequest: BiconomyTokenPaymasterRequest): void { - if (isNullOrUndefined(userOp.callData)) { - throw new Error("Userop callData cannot be undefined"); - } - - const feeTokenAddress = tokenPaymasterRequest?.feeQuote?.tokenAddress; - Logger.log("requested fee token is ", feeTokenAddress); - - if (!feeTokenAddress || feeTokenAddress == ethers.constants.AddressZero) { - throw new Error("Invalid or missing token address. Token address must be part of the feeQuote in tokenPaymasterRequest"); - } - - const spender = tokenPaymasterRequest?.spender; - Logger.log("fee token approval to be checked and added for spender: ", spender); - - if (!spender || spender == ethers.constants.AddressZero) { - throw new Error("Invalid or missing spender address. Sepnder address must be part of tokenPaymasterRequest"); - } - } - - /** - * - * @param userOp partial user operation without signature and paymasterAndData - * @param tokenPaymasterRequest This dto provides information about fee quote. Fee quote is received from earlier request getFeeQuotesOrData() to the Biconomy paymaster. - * maxFee and token decimals from the quote, along with the spender is required to append approval transaction. - * @notice This method should be called when gas is paid in ERC20 token using TokenPaymaster - * @description Optional method to update the userOp.calldata with batched transaction which approves the paymaster spender with necessary amount(if required) - * @returns updated userOp with new callData, callGasLimit - */ - async buildTokenPaymasterUserOp( - userOp: Partial, - tokenPaymasterRequest: BiconomyTokenPaymasterRequest, - ): Promise> { - this.validateUserOpAndRequest(userOp, tokenPaymasterRequest); - try { - let batchTo: Array = []; - let batchValue: Array = []; - let batchData: Array = []; - - let newCallData = userOp.callData; - Logger.log("received information about fee token address and quote ", tokenPaymasterRequest); - - if (this.paymaster && this.paymaster instanceof BiconomyPaymaster) { - // Make a call to paymaster.buildTokenApprovalTransaction() with necessary details - - // Review: might request this form of an array of Transaction - const approvalRequest: Transaction = await (this.paymaster as IHybridPaymaster).buildTokenApprovalTransaction( - tokenPaymasterRequest, - this.provider, - ); - Logger.log("approvalRequest is for erc20 token ", approvalRequest.to); - - if (approvalRequest.data == "0x" || approvalRequest.to == ethers.constants.AddressZero) { - return userOp; - } - - if (isNullOrUndefined(userOp.callData)) { - throw new Error("Userop callData cannot be undefined"); - } - - const decodedDataSmartWallet = this.proxy.interface.parseTransaction({ - data: userOp.callData!.toString(), - }); - if (!decodedDataSmartWallet) { - throw new Error("Could not parse call data of smart wallet for userOp"); - } - - const smartWalletExecFunctionName = decodedDataSmartWallet.name; - - if (smartWalletExecFunctionName === "executeCall") { - Logger.log("originally an executeCall for Biconomy Account"); - const methodArgsSmartWalletExecuteCall = decodedDataSmartWallet.args; - const toOriginal = methodArgsSmartWalletExecuteCall[0]; - const valueOriginal = methodArgsSmartWalletExecuteCall[1]; - const dataOriginal = methodArgsSmartWalletExecuteCall[2]; - - batchTo.push(toOriginal); - batchValue.push(valueOriginal); - batchData.push(dataOriginal); - } else if (smartWalletExecFunctionName === "executeBatchCall") { - Logger.log("originally an executeBatchCall for Biconomy Account"); - const methodArgsSmartWalletExecuteCall = decodedDataSmartWallet.args; - batchTo = methodArgsSmartWalletExecuteCall[0]; - batchValue = methodArgsSmartWalletExecuteCall[1]; - batchData = methodArgsSmartWalletExecuteCall[2]; - } - - if (approvalRequest.to && approvalRequest.data && approvalRequest.value) { - batchTo = [approvalRequest.to, ...batchTo]; - batchValue = [approvalRequest.value, ...batchValue]; - batchData = [approvalRequest.data, ...batchData]; - - newCallData = this.getExecuteBatchCallData(batchTo, batchValue, batchData); - } - const finalUserOp: Partial = { - ...userOp, - callData: newCallData, - }; - - return finalUserOp; - } - } catch (error) { - Logger.log("Failed to update userOp. sending back original op"); - Logger.error("Failed to update callData with error", error); - return userOp; - } - return userOp; - } - - async getAllTokenBalances(balancesDto: BalancesDto): Promise { - return this.nodeClient.getAllTokenBalances(balancesDto); - } - - async getTotalBalanceInUsd(balancesDto: BalancesDto): Promise { - return this.nodeClient.getTotalBalanceInUsd(balancesDto); - } - - async getSmartAccountsByOwner(smartAccountByOwnerDto: SmartAccountByOwnerDto): Promise { - return this.nodeClient.getSmartAccountsByOwner(smartAccountByOwnerDto); - } - - async getTransactionsByAddress(chainId: number, address: string): Promise { - return this.nodeClient.getTransactionByAddress(chainId, address); - } - - async getTransactionByHash(txHash: string): Promise { - return this.nodeClient.getTransactionByHash(txHash); - } - - async getAllSupportedChains(): Promise { - return this.nodeClient.getAllSupportedChains(); - } - - async getUpdateImplementationData(newImplementationAddress?: string): Promise { - // V2 address or latest implementation if possible to jump from V1 -> Vn without upgrading to V2 - // If needed we can fetch this from backend config - - Logger.log("Recommended implementation address to upgrade to", BICONOMY_IMPLEMENTATION_ADDRESSES_BY_VERSION.V2_0_0); - - const latestImplementationAddress = newImplementationAddress ?? DEFAULT_BICONOMY_IMPLEMENTATION_ADDRESS; // BICONOMY_IMPLEMENTATION_ADDRESSES_BY_VERSION.V2_0_0 // 2.0 - Logger.log("Requested implementation address to upgrade to", latestImplementationAddress); - - // by querying the proxy contract - // TODO: add isDeployed checks before reading below - const currentImplementationAddress = await this.proxy.getImplementation(); - Logger.log("Current implementation address for this Smart Account", currentImplementationAddress); - - if (ethers.utils.getAddress(currentImplementationAddress) !== ethers.utils.getAddress(latestImplementationAddress)) { - const impInterface = new ethers.utils.Interface(["function updateImplementation(address _implementation)"]); - const encodedData = impInterface.encodeFunctionData("updateImplementation", [latestImplementationAddress]); - return { to: this.address, value: BigNumber.from(0), data: encodedData }; - } else { - return { to: this.address, value: 0, data: "0x" }; - } - } - - async getModuleSetupData(ecdsaModuleAddress?: string): Promise { - try { - const moduleAddress = ecdsaModuleAddress ?? DEFAULT_ECDSA_OWNERSHIP_MODULE; - const ecdsaModule = await ECDSAOwnershipValidationModule.create({ - signer: this.signer, - moduleAddress: moduleAddress, - }); - - // initForSmartAccount - const ecdsaOwnershipSetupData = await ecdsaModule.getInitData(); - - const proxyInstanceDto = { - smartAccountType: SmartAccountType.BICONOMY, - version: "V2_0_0", // Review - contractAddress: this.address, - provider: this.provider, - }; - const accountV2: SmartAccount_v200 = getSAProxyContract(proxyInstanceDto) as SmartAccount_v200; - - const data = accountV2.interface.encodeFunctionData("setupAndEnableModule", [moduleAddress, ecdsaOwnershipSetupData]); - - return { to: this.address, value: 0, data: data }; - } catch (error) { - Logger.error("Failed to get module setup data", error); - // Could throw error - return { to: this.address, value: 0, data: "0x" }; - } - } - - // Once this userOp is sent (batch: a. updateImplementation and b. setupModule on upgraded proxy) - // Afterwards you can start using BiconomySmartAccountV2 - async updateImplementationUserOp(newImplementationAddress?: string, ecdsaModuleAddress?: string): Promise> { - const tx1 = await this.getUpdateImplementationData(newImplementationAddress); - const tx2 = await this.getModuleSetupData(ecdsaModuleAddress); - - if (tx1.data !== "0x" && tx2.data !== "0x") { - const partialUserOp: Partial = await this.buildUserOp([tx1, tx2]); - return partialUserOp; - } else { - throw new Error("Not eligible for upgrade"); - } - } -} diff --git a/packages/account/src/BiconomySmartAccountV2.ts b/packages/account/src/BiconomySmartAccountV2.ts index fe9ce9e39..e5a7bfb48 100644 --- a/packages/account/src/BiconomySmartAccountV2.ts +++ b/packages/account/src/BiconomySmartAccountV2.ts @@ -1,71 +1,91 @@ -import { JsonRpcProvider } from "@ethersproject/providers"; -import { ethers, BigNumberish, BytesLike, BigNumber } from "ethers"; -import { BaseSmartAccount } from "./BaseSmartAccount"; -import { Bytes, getCreate2Address, hexConcat, keccak256, solidityKeccak256 } from "ethers/lib/utils"; import { - Logger, - NODE_CLIENT_URL, - SmartAccount_v200, - SmartAccountFactory_v200, - SmartAccount_v200__factory, - SmartAccountFactory_v200__factory, - AddressResolver, - AddressResolver__factory, - isNullOrUndefined, -} from "@biconomy/common"; + Hex, + keccak256, + encodePacked, + getCreate2Address, + encodeAbiParameters, + parseAbiParameters, + toHex, + toBytes, + encodeFunctionData, + PublicClient, + createPublicClient, + http, + concatHex, + GetContractReturnType, + getContract, + decodeFunctionData, +} from "viem"; +import { + BaseSmartContractAccount, + getChain, + type BigNumberish, + type UserOperationStruct, + BatchUserOperationCallData, + SmartAccountSigner, +} from "@alchemy/aa-core"; +import { isNullOrUndefined, packUserOp } from "./utils/Utils.js"; +import { BaseValidationModule, ModuleInfo, SendUserOpParams, createECDSAOwnershipValidationModule } from "@biconomy/modules"; +import { + IHybridPaymaster, + IPaymaster, + Paymaster, + PaymasterMode, + SponsorUserOperationDto, + Bundler, + IBundler, + UserOpResponse, + extractChainIdFromBundlerUrl, + convertSigner, +} from "./index.js"; import { BiconomyTokenPaymasterRequest, BiconomySmartAccountV2Config, CounterFactualAddressParam, BuildUserOpOptions, - Overrides, NonceOptions, - SmartAccountInfo, + Transaction, QueryParamsForAddressResolver, -} from "./utils/Types"; -import { BaseValidationModule, ECDSAOwnershipValidationModule, ModuleInfo, SendUserOpParams } from "@biconomy/modules"; -import { UserOperation, Transaction } from "@biconomy/core-types"; -import NodeClient from "@biconomy/node-client"; -import INodeClient from "@biconomy/node-client"; -import { IHybridPaymaster, BiconomyPaymaster, SponsorUserOperationDto } from "@biconomy/paymaster"; -import { - SupportedChainsResponse, - BalancesResponse, - BalancesDto, - UsdBalanceResponse, - SmartAccountByOwnerDto, - SmartAccountsResponse, - SCWTransactionResponse, -} from "@biconomy/node-client"; -import { UserOpResponse } from "@biconomy/bundler"; + BiconomySmartAccountV2ConfigConstructorProps, + PaymasterUserOperationDto, + SimulationType, +} from "./utils/Types.js"; import { ADDRESS_RESOLVER_ADDRESS, BICONOMY_IMPLEMENTATION_ADDRESSES_BY_VERSION, DEFAULT_BICONOMY_FACTORY_ADDRESS, DEFAULT_FALLBACK_HANDLER_ADDRESS, PROXY_CREATION_CODE, -} from "./utils/Constants"; -import log from "loglevel"; + ADDRESS_ZERO, + DEFAULT_ENTRYPOINT_ADDRESS, + ERROR_MESSAGES, +} from "./utils/Constants.js"; +import { BiconomyFactoryAbi } from "./abi/Factory.js"; +import { BiconomyAccountAbi } from "./abi/SmartAccount.js"; +import { AccountResolverAbi } from "./abi/AccountResolver.js"; +import { Logger } from "@biconomy/common"; +import { FeeQuotesOrDataDto, FeeQuotesOrDataResponse } from "@biconomy/paymaster"; + +type UserOperationKey = keyof UserOperationStruct; + +export class BiconomySmartAccountV2 extends BaseSmartContractAccount { + private SENTINEL_MODULE = "0x0000000000000000000000000000000000000001"; -type UserOperationKey = keyof UserOperation; -export class BiconomySmartAccountV2 extends BaseSmartAccount { - private nodeClient!: INodeClient; + private index: number; - private SENTINEL_MODULE = "0x0000000000000000000000000000000000000001"; + private chainId: number; - factoryAddress?: string; + private provider: PublicClient; - /** - * our account contract. - * should support the "execFromEntryPoint" and "nonce" methods - */ - accountContract?: SmartAccount_v200; + paymaster?: IPaymaster; + + bundler?: IBundler; - factory?: SmartAccountFactory_v200; + private accountContract?: GetContractReturnType; - private defaultFallbackHandlerAddress!: string; + private defaultFallbackHandlerAddress: Hex; - private implementationAddress!: string; + private implementationAddress: Hex; private scanForUpgradedAccountsFromV1!: boolean; @@ -77,134 +97,168 @@ export class BiconomySmartAccountV2 extends BaseSmartAccount { // Deployed Smart Account can have more than one module enabled. When sending a transaction activeValidationModule is used to prepare and validate userOp signature. activeValidationModule!: BaseValidationModule; - private constructor(readonly biconomySmartAccountConfig: BiconomySmartAccountV2Config) { - super(biconomySmartAccountConfig); - } + private constructor(readonly biconomySmartAccountConfig: BiconomySmartAccountV2ConfigConstructorProps) { + super({ + ...biconomySmartAccountConfig, + chain: getChain(biconomySmartAccountConfig.chainId), + rpcClient: biconomySmartAccountConfig.rpcUrl || getChain(biconomySmartAccountConfig.chainId).rpcUrls.default.http[0], + entryPointAddress: (biconomySmartAccountConfig.entryPointAddress as Hex) ?? DEFAULT_ENTRYPOINT_ADDRESS, + accountAddress: (biconomySmartAccountConfig.accountAddress as Hex) ?? undefined, + factoryAddress: biconomySmartAccountConfig.factoryAddress ?? DEFAULT_BICONOMY_FACTORY_ADDRESS, + }); - /** - * Creates a new instance of BiconomySmartAccountV2. - * - * This method will create a BiconomySmartAccountV2 instance but will not deploy the Smart Account. - * - * Deployment of the Smart Account will be donewith the first user operation. - * - * @param biconomySmartAccountConfig - Configuration for initializing the BiconomySmartAccountV2 instance. - * @returns A promise that resolves to a new instance of BiconomySmartAccountV2. - * @throws An error if something is wrong with the smart account instance creation. - */ - public static async create(biconomySmartAccountConfig: BiconomySmartAccountV2Config): Promise { - const instance = new BiconomySmartAccountV2(biconomySmartAccountConfig); - instance.factoryAddress = biconomySmartAccountConfig.factoryAddress ?? DEFAULT_BICONOMY_FACTORY_ADDRESS; // This would be fetched from V2 + this.defaultValidationModule = biconomySmartAccountConfig.defaultValidationModule; + this.activeValidationModule = biconomySmartAccountConfig.activeValidationModule; + + this.index = biconomySmartAccountConfig.index ?? 0; + this.chainId = biconomySmartAccountConfig.chainId; + this.bundler = biconomySmartAccountConfig.bundler; + this.implementationAddress = biconomySmartAccountConfig.implementationAddress ?? (BICONOMY_IMPLEMENTATION_ADDRESSES_BY_VERSION.V2_0_0 as Hex); if (biconomySmartAccountConfig.biconomyPaymasterApiKey) { - instance.paymaster = new BiconomyPaymaster({ + this.paymaster = new Paymaster({ paymasterUrl: `https://paymaster.biconomy.io/api/v1/${biconomySmartAccountConfig.chainId}/${biconomySmartAccountConfig.biconomyPaymasterApiKey}`, }); + } else { + this.paymaster = biconomySmartAccountConfig.paymaster; } + this.bundler = biconomySmartAccountConfig.bundler; + const defaultFallbackHandlerAddress = - instance.factoryAddress === DEFAULT_BICONOMY_FACTORY_ADDRESS - ? DEFAULT_FALLBACK_HANDLER_ADDRESS - : biconomySmartAccountConfig.defaultFallbackHandler; + this.factoryAddress === DEFAULT_BICONOMY_FACTORY_ADDRESS ? DEFAULT_FALLBACK_HANDLER_ADDRESS : biconomySmartAccountConfig.defaultFallbackHandler; if (!defaultFallbackHandlerAddress) { throw new Error("Default Fallback Handler address is not provided"); } - instance.accountAddress = biconomySmartAccountConfig.senderAddress ?? undefined; - instance.defaultFallbackHandlerAddress = defaultFallbackHandlerAddress; - - instance.implementationAddress = biconomySmartAccountConfig.implementationAddress ?? BICONOMY_IMPLEMENTATION_ADDRESSES_BY_VERSION.V2_0_0; - - // Note: if no module is provided, we will use ECDSA_OWNERSHIP as default - if (biconomySmartAccountConfig.defaultValidationModule) { - instance.defaultValidationModule = biconomySmartAccountConfig.defaultValidationModule; - } else { - instance.defaultValidationModule = await ECDSAOwnershipValidationModule.create({ - signer: biconomySmartAccountConfig.signer!, - }); - } + this.defaultFallbackHandlerAddress = defaultFallbackHandlerAddress; - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - instance.activeValidationModule = biconomySmartAccountConfig.activeValidationModule ?? instance.defaultValidationModule; + // Added bang operator to avoid null check as the constructor have these params as optional + this.defaultValidationModule = biconomySmartAccountConfig.defaultValidationModule!; + this.activeValidationModule = biconomySmartAccountConfig.activeValidationModule!; - const { rpcUrl, nodeClientUrl } = biconomySmartAccountConfig; - - if (rpcUrl) { - instance.provider = new JsonRpcProvider(rpcUrl); - } - - instance.nodeClient = new NodeClient({ txServiceUrl: nodeClientUrl ?? NODE_CLIENT_URL }); - - instance.scanForUpgradedAccountsFromV1 = biconomySmartAccountConfig.scanForUpgradedAccountsFromV1 ?? false; - - instance.maxIndexForScan = biconomySmartAccountConfig.maxIndexForScan ?? 10; - - await instance.init(); + this.provider = createPublicClient({ + chain: getChain(biconomySmartAccountConfig.chainId), + transport: http(biconomySmartAccountConfig.rpcUrl || getChain(biconomySmartAccountConfig.chainId).rpcUrls.default.http[0]), + }); - return instance; + this.scanForUpgradedAccountsFromV1 = biconomySmartAccountConfig.scanForUpgradedAccountsFromV1 ?? false; + this.maxIndexForScan = biconomySmartAccountConfig.maxIndexForScan ?? 10; } - async _getAccountContract(): Promise { - if (this.accountContract == null) { - this.accountContract = SmartAccount_v200__factory.connect(await this.getAccountAddress(), this.provider); + /** + * Creates a new instance of BiconomySmartAccountV2 + * + * This method will create a BiconomySmartAccountV2 instance but will not deploy the Smart Account + * Deployment of the Smart Account will be donewith the first user operation. + * + * - Docs: https://docs.biconomy.io/Account/integration#integration-1 + * + * @param biconomySmartAccountConfig - Configuration for initializing the BiconomySmartAccountV2 instance. + * @returns A promise that resolves to a new instance of BiconomySmartAccountV2. + * @throws An error if something is wrong with the smart account instance creation. + * + * @example + * import { createClient } from "viem" + * import { createSmartAccountClient, BiconomySmartAccountV2 } from "@biconomy/account" + * import { createWalletClient, http } from "viem"; + * import { polygonMumbai } from "viem/chains"; + * + * const signer = createWalletClient({ + * account, + * chain: polygonMumbai, + * transport: http(), + * }); + * + * const bundlerUrl = "" // Retrieve bundler url from dasboard + * + * const smartAccountFromStaticCreate = await BiconomySmartAccountV2.create({ signer, bundlerUrl }); + * + * // Is the same as... + * + * const smartAccount = await createSmartAccountClient({ signer, bundlerUrl }); + * + */ + public static async create(biconomySmartAccountConfig: BiconomySmartAccountV2Config): Promise { + let chainId = biconomySmartAccountConfig.chainId; + let resolvedSmartAccountSigner!: SmartAccountSigner; + let rpcUrl = biconomySmartAccountConfig.rpcUrl; + + // Signer needs to be initialised here before defaultValidationModule is set + if (biconomySmartAccountConfig.signer) { + const signerResult = await convertSigner(biconomySmartAccountConfig.signer, !!chainId); + if (!chainId && !!signerResult.chainId) { + chainId = signerResult.chainId; + } + if (!rpcUrl && !!signerResult.rpcUrl) { + rpcUrl = signerResult.rpcUrl; + } + resolvedSmartAccountSigner = signerResult.signer; } - return this.accountContract; - } - - isActiveValidationModuleDefined(): boolean { - if (!this.activeValidationModule) throw new Error("Must provide an instance of active validation module."); - return true; - } - - isDefaultValidationModuleDefined(): boolean { - if (!this.defaultValidationModule) throw new Error("Must provide an instance of default validation module."); - return true; - } - - setActiveValidationModule(validationModule: BaseValidationModule): BiconomySmartAccountV2 { - if (validationModule instanceof BaseValidationModule) { - this.activeValidationModule = validationModule; + if (!chainId) { + // Get it from bundler + if (biconomySmartAccountConfig.bundlerUrl) { + chainId = extractChainIdFromBundlerUrl(biconomySmartAccountConfig.bundlerUrl); + } else if (biconomySmartAccountConfig.bundler) { + const bundlerUrlFromBundler = biconomySmartAccountConfig.bundler.getBundlerUrl(); + chainId = extractChainIdFromBundlerUrl(bundlerUrlFromBundler); + } } - return this; - } + if (!chainId) { + throw new Error("chainId required"); + } + const bundler: IBundler = biconomySmartAccountConfig.bundler ?? new Bundler({ bundlerUrl: biconomySmartAccountConfig.bundlerUrl!, chainId }); + let defaultValidationModule = biconomySmartAccountConfig.defaultValidationModule; - setDefaultValidationModule(validationModule: BaseValidationModule): BiconomySmartAccountV2 { - if (validationModule instanceof BaseValidationModule) { - this.defaultValidationModule = validationModule; - this.accountAddress = undefined; + // Note: If no module is provided, we will use ECDSA_OWNERSHIP as default + if (!defaultValidationModule) { + const newModule = await createECDSAOwnershipValidationModule({ signer: resolvedSmartAccountSigner! }); + defaultValidationModule = newModule; } - return this; + const activeValidationModule = biconomySmartAccountConfig?.activeValidationModule ?? defaultValidationModule; + if (!resolvedSmartAccountSigner) { + resolvedSmartAccountSigner = await activeValidationModule.getSigner(); + } + if (!resolvedSmartAccountSigner) { + throw new Error("signer required"); + } + const config: BiconomySmartAccountV2ConfigConstructorProps = { + ...biconomySmartAccountConfig, + defaultValidationModule, + activeValidationModule, + chainId, + bundler, + signer: resolvedSmartAccountSigner, + rpcUrl, + }; + + return new BiconomySmartAccountV2(config); } - // Could call it nonce space - async getNonce(nonceKey?: number): Promise { - const nonceSpace = nonceKey ?? 0; - try { - const accountContract = await this._getAccountContract(); - const nonce = await accountContract.nonce(nonceSpace); - return nonce; - } catch (e) { - log.debug("Failed to get nonce from deployed account. Returning 0 as nonce"); - return BigNumber.from(0); + // Calls the getCounterFactualAddress + async getAddress(params?: CounterFactualAddressParam): Promise { + if (this.accountAddress == null) { + // means it needs deployment + this.accountAddress = await this.getCounterFactualAddress(params); } + return this.accountAddress; } - /** - * return the account's address. - * this value is valid even before deploying the contract. - */ - async getAccountAddress(params?: CounterFactualAddressParam): Promise { + // Calls the getCounterFactualAddress + async getAccountAddress(params?: CounterFactualAddressParam): Promise<`0x${string}`> { if (this.accountAddress == null || this.accountAddress == undefined) { + // means it needs deployment this.accountAddress = await this.getCounterFactualAddress(params); } return this.accountAddress; } /** - * calculate the account address even before it is deployed + * Return the account's address. This value is valid even before deploying the contract. */ - async getCounterFactualAddress(params?: CounterFactualAddressParam): Promise { + async getCounterFactualAddress(params?: CounterFactualAddressParam): Promise { const validationModule = params?.validationModule ?? this.defaultValidationModule; const index = params?.index ?? this.index; + const maxIndexForScan = params?.maxIndexForScan ?? this.maxIndexForScan; // Review: default behavior const scanForUpgradedAccountsFromV1 = params?.scanForUpgradedAccountsFromV1 ?? this.scanForUpgradedAccountsFromV1; @@ -212,9 +266,9 @@ export class BiconomySmartAccountV2 extends BaseSmartAccount { // if it's intended to detect V1 upgraded accounts if (scanForUpgradedAccountsFromV1) { const eoaSigner = await validationModule.getSigner(); - const eoaAddress = await eoaSigner.getAddress(); - const moduleAddress = validationModule.getAddress(); - const moduleSetupData = await validationModule.getInitData(); + const eoaAddress = (await eoaSigner.getAddress()) as Hex; + const moduleAddress = validationModule.getAddress() as Hex; + const moduleSetupData = (await validationModule.getInitData()) as Hex; const queryParams = { eoaAddress, index, @@ -223,36 +277,35 @@ export class BiconomySmartAccountV2 extends BaseSmartAccount { maxIndexForScan, }; const accountAddress = await this.getV1AccountsUpgradedToV2(queryParams); - Logger.log("account address from V1 ", accountAddress); - if (accountAddress !== ethers.constants.AddressZero) { + if (accountAddress !== ADDRESS_ZERO) { return accountAddress; } } + const counterFactualAddressV2 = await this.getCounterFactualAddressV2({ validationModule, index }); return counterFactualAddressV2; } - private async getCounterFactualAddressV2(params?: CounterFactualAddressParam): Promise { - if (this.factory == null) { - if (this.factoryAddress != null && this.factoryAddress !== "") { - this.factory = SmartAccountFactory_v200__factory.connect(this.factoryAddress, this.provider); - } else { - throw new Error("no factory to get initCode"); - } - } - + private async getCounterFactualAddressV2(params?: CounterFactualAddressParam): Promise { const validationModule = params?.validationModule ?? this.defaultValidationModule; const index = params?.index ?? this.index; try { - const initCalldata = SmartAccount_v200__factory.createInterface().encodeFunctionData("init", [ - this.defaultFallbackHandlerAddress, - validationModule.getAddress(), - await validationModule.getInitData(), - ]); - const proxyCreationCodeHash = solidityKeccak256(["bytes", "uint256"], [PROXY_CREATION_CODE, this.implementationAddress]); - const salt = solidityKeccak256(["bytes32", "uint256"], [keccak256(initCalldata), index]); - const counterFactualAddress = getCreate2Address(this.factory.address, salt, proxyCreationCodeHash); + const initCalldata = encodeFunctionData({ + abi: BiconomyAccountAbi, + functionName: "init", + args: [this.defaultFallbackHandlerAddress, validationModule.getAddress() as Hex, (await validationModule.getInitData()) as Hex], + }); + + const proxyCreationCodeHash = keccak256(encodePacked(["bytes", "uint256"], [PROXY_CREATION_CODE, BigInt(this.implementationAddress)])); + + const salt = keccak256(encodePacked(["bytes32", "uint256"], [keccak256(initCalldata), BigInt(index)])); + + const counterFactualAddress = getCreate2Address({ + from: this.factoryAddress, + salt: salt, + bytecodeHash: proxyCreationCodeHash, + }); return counterFactualAddress; } catch (e) { @@ -260,60 +313,93 @@ export class BiconomySmartAccountV2 extends BaseSmartAccount { } } - async getV1AccountsUpgradedToV2(params: QueryParamsForAddressResolver): Promise { - Logger.log("index to filter ", params.index); + async _getAccountContract(): Promise> { + if (this.accountContract == null) { + this.accountContract = getContract({ + address: await this.getAddress(), + abi: BiconomyAccountAbi, + client: this.provider as PublicClient, + }); + } + return this.accountContract; + } + + isActiveValidationModuleDefined(): boolean { + if (!this.activeValidationModule) throw new Error("Must provide an instance of active validation module."); + return true; + } + + isDefaultValidationModuleDefined(): boolean { + if (!this.defaultValidationModule) throw new Error("Must provide an instance of default validation module."); + return true; + } + + setActiveValidationModule(validationModule: BaseValidationModule): BiconomySmartAccountV2 { + if (validationModule instanceof BaseValidationModule) { + this.activeValidationModule = validationModule; + } + return this; + } + + setDefaultValidationModule(validationModule: BaseValidationModule): BiconomySmartAccountV2 { + if (validationModule instanceof BaseValidationModule) { + this.defaultValidationModule = validationModule; + } + return this; + } + + async getV1AccountsUpgradedToV2(params: QueryParamsForAddressResolver): Promise { const maxIndexForScan = params.maxIndexForScan ?? this.maxIndexForScan; - const addressResolver: AddressResolver = AddressResolver__factory.connect(ADDRESS_RESOLVER_ADDRESS, this.provider); + + const addressResolver = getContract({ + address: ADDRESS_RESOLVER_ADDRESS, + abi: AccountResolverAbi, + client: { + public: this.provider as PublicClient, + }, + }); // Note: depending on moduleAddress and moduleSetupData passed call this. otherwise could call resolveAddresses() if (params.moduleAddress && params.moduleSetupData) { - const result: SmartAccountInfo[] = await addressResolver.resolveAddressesFlexibleForV2( + const result = await addressResolver.read.resolveAddressesFlexibleForV2([ params.eoaAddress, maxIndexForScan, params.moduleAddress, params.moduleSetupData, - ); + ]); const desiredV1Account = result.find( - (smartAccountInfo) => + (smartAccountInfo: { factoryVersion: string; currentVersion: string; deploymentIndex: { toString: () => any } }) => smartAccountInfo.factoryVersion === "v1" && smartAccountInfo.currentVersion === "2.0.0" && - smartAccountInfo.deploymentIndex.toNumber() === params.index, + Number(smartAccountInfo.deploymentIndex.toString()) === params.index, ); if (desiredV1Account) { const smartAccountAddress = desiredV1Account.accountAddress; return smartAccountAddress; } else { - return ethers.constants.AddressZero; + return ADDRESS_ZERO; } } else { - return ethers.constants.AddressZero; + return ADDRESS_ZERO; } } /** - * return the value to put into the "initCode" field, if the account is not yet deployed. - * this value holds the "factory" address, followed by this account's information + * Return the value to put into the "initCode" field, if the account is not yet deployed. + * This value holds the "factory" address, followed by this account's information */ - async getAccountInitCode(): Promise { - if (this.factory == null) { - if (this.factoryAddress != null && this.factoryAddress !== "") { - this.factory = SmartAccountFactory_v200__factory.connect(this.factoryAddress, this.provider); - } else { - throw new Error("no factory to get initCode"); - } - } - + async getAccountInitCode(): Promise { this.isDefaultValidationModuleDefined(); - return hexConcat([ - this.factory.address, - this.factory.interface.encodeFunctionData("deployCounterFactualAccount", [ - this.defaultValidationModule.getAddress(), - await this.defaultValidationModule.getInitData(), - this.index, - ]), + return concatHex([ + this.factoryAddress as Hex, + encodeFunctionData({ + abi: BiconomyFactoryAbi, + functionName: "deployCounterFactualAccount", + args: [this.defaultValidationModule.getAddress() as Hex, (await this.defaultValidationModule.getInitData()) as Hex, BigInt(this.index)], + }), ]); } @@ -322,11 +408,15 @@ export class BiconomySmartAccountV2 extends BaseSmartAccount { * @param to { target } address of transaction * @param value represents amount of native tokens * @param data represent data associated with transaction - * @returns + * @returns encoded data for execute function */ - async encodeExecute(to: string, value: BigNumberish, data: BytesLike): Promise { - const accountContract = await this._getAccountContract(); - return accountContract.interface.encodeFunctionData("execute_ncC", [to, value, data]); + async encodeExecute(to: Hex, value: bigint, data: Hex): Promise { + // return accountContract.interface.encodeFunctionData("execute_ncC", [to, value, data]) as Hex; + return encodeFunctionData({ + abi: BiconomyAccountAbi, + functionName: "execute_ncC", + args: [to, value, data], + }); } /** @@ -334,17 +424,40 @@ export class BiconomySmartAccountV2 extends BaseSmartAccount { * @param to { target } array of addresses in transaction * @param value represents array of amount of native tokens associated with each transaction * @param data represent array of data associated with each transaction - * @returns + * @returns encoded data for executeBatch function */ - async encodeExecuteBatch(to: Array, value: Array, data: Array): Promise { - const accountContract = await this._getAccountContract(); - return accountContract.interface.encodeFunctionData("executeBatch_y6U", [to, value, data]); + async encodeExecuteBatch(to: Array, value: Array, data: Array): Promise { + return encodeFunctionData({ + abi: BiconomyAccountAbi, + functionName: "executeBatch_y6U", + args: [to, value, data], + }); + } + + override async encodeBatchExecute(txs: BatchUserOperationCallData): Promise { + const [targets, datas, value] = txs.reduce( + (accum, curr) => { + accum[0].push(curr.target); + accum[1].push(curr.data); + accum[2].push(curr.value || BigInt(0)); + + return accum; + }, + [[], [], []] as [Hex[], Hex[], bigint[]], + ); + + return this.encodeExecuteBatch(targets, value, datas); } // dummy signature depends on the validation module supplied. - async getDummySignature(params?: ModuleInfo): Promise { + async getDummySignatures(params?: ModuleInfo): Promise { this.isActiveValidationModuleDefined(); - return this.activeValidationModule.getDummySignature(params); + return (await this.activeValidationModule.getDummySignature(params)) as Hex; + } + + // TODO: review this + getDummySignature(): Hex { + throw new Error("Method not implemented! Call getDummySignatures instead."); } // Might use provided paymaster instance to get dummy data (from pm service) @@ -352,7 +465,16 @@ export class BiconomySmartAccountV2 extends BaseSmartAccount { return "0x"; } - async signUserOp(userOp: Partial, params?: SendUserOpParams): Promise { + validateUserOp(userOp: Partial, requiredFields: UserOperationKey[]): boolean { + for (const field of requiredFields) { + if (!userOp[field]) { + throw new Error(`${String(field)} is missing in the UserOp`); + } + } + return true; + } + + async signUserOp(userOp: Partial, params?: SendUserOpParams): Promise { this.isActiveValidationModuleDefined(); const requiredFields: UserOperationKey[] = [ "sender", @@ -366,112 +488,391 @@ export class BiconomySmartAccountV2 extends BaseSmartAccount { "maxPriorityFeePerGas", "paymasterAndData", ]; - super.validateUserOp(userOp, requiredFields); + this.validateUserOp(userOp, requiredFields); const userOpHash = await this.getUserOpHash(userOp); - const moduleSig = await this.activeValidationModule.signUserOpHash(userOpHash, params); + const moduleSig = (await this.activeValidationModule.signUserOpHash(userOpHash, params)) as Hex; - // Note: If the account is undeployed, use ERC-6492 - // Review: Should only be needed for signMessage - /*if (!(await this.isAccountDeployed(await this.getAccountAddress()))) { - const coder = new ethers.utils.AbiCoder(); - const populatedTransaction = await this.factory?.populateTransaction.deployCounterFactualAccount( - await this.defaultValidationModule.getAddress(), - await this.defaultValidationModule.getInitData(), - this.index, - ); - moduleSig = - coder.encode(["address", "bytes", "bytes"], [this.factoryAddress, populatedTransaction?.data, moduleSig]) + - "6492649264926492649264926492649264926492649264926492649264926492"; // magic suffix - userOp.signature = moduleSig; - return userOp as UserOperation; - }*/ - - const signatureWithModuleAddress = ethers.utils.defaultAbiCoder.encode( - ["bytes", "address"], - [moduleSig, this.activeValidationModule.getAddress()], - ); + const signatureWithModuleAddress = this.getSignatureWithModuleAddress(moduleSig, this.activeValidationModule.getAddress() as Hex); userOp.signature = signatureWithModuleAddress; - return userOp as UserOperation; + return userOp as UserOperationStruct; } - getSignatureWithModuleAddress(moduleSignature: string, moduleAddress?: string): string { - const moduleAddressToUse = moduleAddress ?? this.activeValidationModule.getAddress(); - return ethers.utils.defaultAbiCoder.encode(["bytes", "address"], [moduleSignature, moduleAddressToUse]); + getSignatureWithModuleAddress(moduleSignature: Hex, moduleAddress?: Hex): Hex { + const moduleAddressToUse = moduleAddress ?? (this.activeValidationModule.getAddress() as Hex); + return encodeAbiParameters(parseAbiParameters("bytes, address"), [moduleSignature, moduleAddressToUse]); + } + + public async getPaymasterUserOp( + userOp: Partial, + paymasterServiceData: PaymasterUserOperationDto, + ): Promise> { + if (paymasterServiceData.mode === PaymasterMode.SPONSORED) { + return this.getPaymasterAndData(userOp, paymasterServiceData); + } else if (paymasterServiceData.mode === PaymasterMode.ERC20) { + if (paymasterServiceData?.feeQuote) { + const { feeQuote, spender, maxApproval = false } = paymasterServiceData; + Logger.log("there is a feeQuote: ", feeQuote); + if (!spender) throw new Error(ERROR_MESSAGES.SPENDER_REQUIRED); + if (!feeQuote) throw new Error(ERROR_MESSAGES.FAILED_FEE_QUOTE_FETCH); + const partialUserOp = await this.buildTokenPaymasterUserOp(userOp, { + ...paymasterServiceData, + spender, + maxApproval, + feeQuote, + }); + return this.getPaymasterAndData(partialUserOp, { + ...paymasterServiceData, + feeTokenAddress: feeQuote.tokenAddress, + calculateGasLimits: true, // Always recommended and especially when using token paymaster + }); + } else if (paymasterServiceData?.preferredToken) { + const { preferredToken } = paymasterServiceData; + Logger.log("there is a preferred token: ", preferredToken); + const feeQuotesResponse = await this.getPaymasterFeeQuotesOrData(userOp, paymasterServiceData); + const spender = feeQuotesResponse.tokenPaymasterAddress; + const feeQuote = feeQuotesResponse.feeQuotes?.[0]; + if (!spender) throw new Error(ERROR_MESSAGES.SPENDER_REQUIRED); + if (!feeQuote) throw new Error(ERROR_MESSAGES.FAILED_FEE_QUOTE_FETCH); + return this.getPaymasterUserOp(userOp, { ...paymasterServiceData, feeQuote, spender }); // Recursively call getPaymasterUserOp with the feeQuote + } else { + Logger.log("ERC20 mode without feeQuote or preferredToken provided. Passing through unchanged."); + return userOp; + } + } + throw new Error("Invalid paymaster mode"); + } + + private async getPaymasterAndData( + userOp: Partial, + paymasterServiceData: PaymasterUserOperationDto, + ): Promise> { + const paymaster = this.paymaster as IHybridPaymaster; + const paymasterData = await paymaster.getPaymasterAndData(userOp, paymasterServiceData); + return { ...userOp, ...paymasterData }; + } + + private async getPaymasterFeeQuotesOrData( + userOp: Partial, + feeQuotesOrData: FeeQuotesOrDataDto, + ): Promise { + const paymaster = this.paymaster as IHybridPaymaster; + const tokenList = feeQuotesOrData?.preferredToken + ? [feeQuotesOrData?.preferredToken] + : feeQuotesOrData?.tokenList?.length + ? feeQuotesOrData?.tokenList + : []; + return paymaster.getPaymasterFeeQuotesOrData(userOp, { ...feeQuotesOrData, tokenList }); + } + + /** + * + * @description This function will retrieve fees from the paymaster in erc20 mode + * + * @param manyOrOneTransactions Array of {@link Transaction} to be batched and sent. Can also be a single {@link Transaction}. + * @param buildUseropDto {@link BuildUserOpOptions}. + * @returns Promise + * + * @example + * import { createClient } from "viem" + * import { createSmartAccountClient } from "@biconomy/account" + * import { createWalletClient, http } from "viem"; + * import { polygonMumbai } from "viem/chains"; + * + * const signer = createWalletClient({ + * account, + * chain: polygonMumbai, + * transport: http(), + * }); + * + * const smartAccount = await createSmartAccountClient({ signer, bundlerUrl }); // Retrieve bundler url from dasboard + * const encodedCall = encodeFunctionData({ + * abi: parseAbi(["function safeMint(address to) public"]), + * functionName: "safeMint", + * args: ["0x..."], + * }); + * + * const transaction = { + * to: nftAddress, + * data: encodedCall + * } + * + * const feeQuotesResponse: FeeQuotesOrDataResponse = await smartAccount.getTokenFees(transaction, { paymasterServiceData: { mode: PaymasterMode.ERC20 } }); + * + * const userSeletedFeeQuote = feeQuotesResponse.feeQuotes?.[0]; + * + * const { wait } = await smartAccount.sendTransaction(transaction, { + * paymasterServiceData: { + * mode: PaymasterMode.ERC20, + * feeQuote: userSeletedFeeQuote, + * spender: feeQuotesResponse.tokenPaymasterAddress, + * }, + * }); + * + * const { receipt } = await wait(); + * + */ + public async getTokenFees( + manyOrOneTransactions: Transaction | Transaction[], + buildUseropDto: BuildUserOpOptions, + ): Promise { + const txs = Array.isArray(manyOrOneTransactions) ? manyOrOneTransactions : [manyOrOneTransactions]; + const userOp = await this.buildUserOp(txs, buildUseropDto); + if (!buildUseropDto.paymasterServiceData) throw new Error("paymasterServiceData was not provided"); + return this.getPaymasterFeeQuotesOrData(userOp, buildUseropDto.paymasterServiceData); } /** * * @param userOp * @param params - * @description This function call will take 'unsignedUserOp' as an input, sign it with the owner key, and send it to the bundler. + * @description This function will take a user op as an input, sign it with the owner key, and send it to the bundler. * @returns Promise + * Sends a user operation + * + * - Docs: https://docs.biconomy.io/Account/transactions/userpaid#send-useroperation + * + * @param userOp Partial<{@link UserOperationStruct}> the userOp params to be sent. + * @param params {@link SendUserOpParams}. + * @returns Promise<{@link UserOpResponse}> that you can use to track user operation. + * + * @example + * import { createClient } from "viem" + * import { createSmartAccountClient } from "@biconomy/account" + * import { createWalletClient, http } from "viem"; + * import { polygonMumbai } from "viem/chains"; + * + * const signer = createWalletClient({ + * account, + * chain: polygonMumbai, + * transport: http(), + * }); + * + * const smartAccount = await createSmartAccountClient({ signer, bundlerUrl }); // Retrieve bundler url from dasboard + * const encodedCall = encodeFunctionData({ + * abi: parseAbi(["function safeMint(address to) public"]), + * functionName: "safeMint", + * args: ["0x..."], + * }); + * + * const transaction = { + * to: nftAddress, + * data: encodedCall + * } + * + * const userOp = await smartAccount.buildUserOp([transaction]); + * + * const { wait } = await smartAccount.sendUserOp(userOp); + * const { receipt } = await wait(); + * */ - async sendUserOp(userOp: Partial, params?: SendUserOpParams): Promise { - Logger.log("userOp received in base account ", userOp); + async sendUserOp(userOp: Partial, params?: SendUserOpParams): Promise { delete userOp.signature; const userOperation = await this.signUserOp(userOp, params); - const bundlerResponse = await this.sendSignedUserOp(userOperation, params); + const bundlerResponse = await this.sendSignedUserOp(userOperation, params?.simulationType); + return bundlerResponse; + } + + /** + * + * @param userOp - The signed user operation to send + * @param simulationType - The type of simulation to perform ("validation" | "validation_and_execution") + * @description This function call will take 'signedUserOp' as input and send it to the bundler + * @returns + */ + async sendSignedUserOp(userOp: UserOperationStruct, simulationType?: SimulationType): Promise { + const requiredFields: UserOperationKey[] = [ + "sender", + "nonce", + "initCode", + "callData", + "callGasLimit", + "verificationGasLimit", + "preVerificationGas", + "maxFeePerGas", + "maxPriorityFeePerGas", + "paymasterAndData", + "signature", + ]; + this.validateUserOp(userOp, requiredFields); + if (!this.bundler) throw new Error("Bundler is not provided"); + Logger.warn("userOp being sent to the bundler", userOp); + const bundlerResponse = await this.bundler.sendUserOp(userOp, simulationType); return bundlerResponse; } - private async getBuildUserOpNonce(nonceOptions: NonceOptions | undefined): Promise { - let nonce = BigNumber.from(0); + async getUserOpHash(userOp: Partial): Promise { + const userOpHash = keccak256(packUserOp(userOp, true) as Hex); + const enc = encodeAbiParameters(parseAbiParameters("bytes32, address, uint256"), [userOpHash, this.entryPoint.address, BigInt(this.chainId)]); + return keccak256(enc); + } + + async estimateUserOpGas(userOp: Partial): Promise> { + if (!this.bundler) throw new Error("Bundler is not provided"); + const requiredFields: UserOperationKey[] = ["sender", "nonce", "initCode", "callData"]; + this.validateUserOp(userOp, requiredFields); + + const finalUserOp = userOp; + + // Making call to bundler to get gas estimations for userOp + const { callGasLimit, verificationGasLimit, preVerificationGas, maxFeePerGas, maxPriorityFeePerGas } = + await this.bundler.estimateUserOpGas(userOp); + // if neither user sent gas fee nor the bundler, estimate gas from provider + if (!userOp.maxFeePerGas && !userOp.maxPriorityFeePerGas && (!maxFeePerGas || !maxPriorityFeePerGas)) { + const feeData = await this.provider.estimateFeesPerGas(); + if (feeData.maxFeePerGas?.toString()) { + finalUserOp.maxFeePerGas = ("0x" + feeData.maxFeePerGas.toString(16)) as Hex; + } else if (feeData.gasPrice?.toString()) { + finalUserOp.maxFeePerGas = ("0x" + feeData.gasPrice.toString(16)) as Hex; + } else { + finalUserOp.maxFeePerGas = ("0x" + (await this.provider.getGasPrice()).toString(16)) as Hex; + } + + if (feeData.maxPriorityFeePerGas?.toString()) { + finalUserOp.maxPriorityFeePerGas = ("0x" + feeData.maxPriorityFeePerGas?.toString()) as Hex; + } else if (feeData.gasPrice?.toString()) { + finalUserOp.maxPriorityFeePerGas = toHex(Number(feeData.gasPrice?.toString())); + } else { + finalUserOp.maxPriorityFeePerGas = ("0x" + (await this.provider.getGasPrice()).toString(16)) as Hex; + } + } else { + finalUserOp.maxFeePerGas = toHex(Number(maxFeePerGas)) ?? userOp.maxFeePerGas; + finalUserOp.maxPriorityFeePerGas = toHex(Number(maxPriorityFeePerGas)) ?? userOp.maxPriorityFeePerGas; + } + finalUserOp.verificationGasLimit = toHex(Number(verificationGasLimit)) ?? userOp.verificationGasLimit; + finalUserOp.callGasLimit = toHex(Number(callGasLimit)) ?? userOp.callGasLimit; + finalUserOp.preVerificationGas = toHex(Number(preVerificationGas)) ?? userOp.preVerificationGas; + if (!finalUserOp.paymasterAndData) { + finalUserOp.paymasterAndData = "0x"; + } + + return finalUserOp; + } + + // Could call it nonce space + async getNonce(nonceKey?: number): Promise { + const nonceSpace = nonceKey ?? 0; + try { + const address = await this.getAddress(); + return await this.entryPoint.read.getNonce([address, BigInt(nonceSpace)]); + } catch (e) { + return BigInt(0); + } + } + + private async getBuildUserOpNonce(nonceOptions: NonceOptions | undefined): Promise { + let nonce = BigInt(0); try { if (nonceOptions?.nonceOverride) { - nonce = BigNumber.from(nonceOptions?.nonceOverride); + nonce = BigInt(nonceOptions?.nonceOverride); } else { const _nonceSpace = nonceOptions?.nonceKey ?? 0; nonce = await this.getNonce(_nonceSpace); } } catch (error) { // Not throwing this error as nonce would be 0 if this.getNonce() throw exception, which is expected flow for undeployed account - Logger.log("Error while getting nonce for the account. This is expected for undeployed accounts set nonce to 0"); + Logger.warn("Error while getting nonce for the account. This is expected for undeployed accounts set nonce to 0"); } return nonce; } - private async getGasFeeValues( - overrides: Overrides | undefined, - skipBundlerGasEstimation: boolean | undefined, - ): Promise<{ maxFeePerGas?: BigNumberish | undefined; maxPriorityFeePerGas?: BigNumberish | undefined }> { - const gasFeeValues = { - maxFeePerGas: overrides?.maxFeePerGas, - maxPriorityFeePerGas: overrides?.maxPriorityFeePerGas, - }; - try { - if (this.bundler && !gasFeeValues.maxFeePerGas && !gasFeeValues.maxPriorityFeePerGas && (skipBundlerGasEstimation ?? true)) { - const gasFeeEstimation = await this.bundler.getGasFeeValues(); - gasFeeValues.maxFeePerGas = gasFeeEstimation.maxFeePerGas; - gasFeeValues.maxPriorityFeePerGas = gasFeeEstimation.maxPriorityFeePerGas; - } - return gasFeeValues; - } catch (error: any) { - Logger.error("Error while getting gasFeeValues from bundler. Provided bundler might not have getGasFeeValues endpoint", error); - return gasFeeValues; - } + /** + * Sends a transaction (builds and sends a user op in sequence) + * + * - Docs: https://docs.biconomy.io/Account/transactions/userpaid#send-transaction + * + * @param manyOrOneTransactions Array of {@link Transaction} to be batched and sent. Can also be a single {@link Transaction}. + * @param buildUseropDto {@link BuildUserOpOptions}. + * @returns Promise<{@link UserOpResponse}> that you can use to track user operation. + * + * @example + * import { createClient } from "viem" + * import { createSmartAccountClient } from "@biconomy/account" + * import { createWalletClient, http } from "viem"; + * import { polygonMumbai } from "viem/chains"; + * + * const signer = createWalletClient({ + * account, + * chain: polygonMumbai, + * transport: http(), + * }); + * + * const smartAccount = await createSmartAccountClient({ signer, bundlerUrl }); // Retrieve bundler url from dasboard + * const encodedCall = encodeFunctionData({ + * abi: parseAbi(["function safeMint(address to) public"]), + * functionName: "safeMint", + * args: ["0x..."], + * }); + * + * const transaction = { + * to: nftAddress, + * data: encodedCall + * } + * + * const { waitForTxHash } = await smartAccount.sendTransaction(transaction); + * const { transactionHash, userOperationReceipt } = await wait(); + * + */ + async sendTransaction(manyOrOneTransactions: Transaction | Transaction[], buildUseropDto?: BuildUserOpOptions): Promise { + const userOp = await this.buildUserOp(Array.isArray(manyOrOneTransactions) ? manyOrOneTransactions : [manyOrOneTransactions], buildUseropDto); + return this.sendUserOp(userOp, { simulationType: buildUseropDto?.simulationType, ...buildUseropDto?.params }); } - async buildUserOp(transactions: Transaction[], buildUseropDto?: BuildUserOpOptions): Promise> { - const to = transactions.map((element: Transaction) => element.to); - const data = transactions.map((element: Transaction) => element.data ?? "0x"); - const value = transactions.map((element: Transaction) => element.value ?? BigNumber.from("0")); + /** + * Builds a user operation + * + * - Docs: https://docs.biconomy.io/Account/transactions/userpaid#build-useroperation + * + * @param transactions Array of {@link Transaction} to be sent. + * @param buildUseropDto {@link BuildUserOpOptions}. + * @returns Promise> the built user operation to be sent. + * + * @example + * import { createClient } from "viem" + * import { createSmartAccountClient } from "@biconomy/account" + * import { createWalletClient, http } from "viem"; + * import { polygonMumbai } from "viem/chains"; + * + * const signer = createWalletClient({ + * account, + * chain: polygonMumbai, + * transport: http(), + * }); + * + * const smartAccount = await createSmartAccountClient({ signer, bundlerUrl }); // Retrieve bundler url from dasboard + * const encodedCall = encodeFunctionData({ + * abi: parseAbi(["function safeMint(address to) public"]), + * functionName: "safeMint", + * args: ["0x..."], + * }); + * + * const transaction = { + * to: nftAddress, + * data: encodedCall + * } + * + * const userOp = await smartAccount.buildUserOp([{ to: "0x...", data: encodedCall }]); + * + */ + async buildUserOp(transactions: Transaction[], buildUseropDto?: BuildUserOpOptions): Promise> { + const to = transactions.map((element: Transaction) => element.to as Hex); + const data = transactions.map((element: Transaction) => (element.data as Hex) ?? "0x"); + const value = transactions.map((element: Transaction) => (element.value as bigint) ?? BigInt(0)); const initCodeFetchPromise = this.getInitCode(); - const dummySignatureFetchPromise = this.getDummySignature(buildUseropDto?.params); + const dummySignatureFetchPromise = this.getDummySignatures(buildUseropDto?.params); - const [nonceFromFetch, initCode, signature, finalGasFeeValue] = await Promise.all([ + const [nonceFromFetch, initCode, signature] = await Promise.all([ this.getBuildUserOpNonce(buildUseropDto?.nonceOptions), initCodeFetchPromise, dummySignatureFetchPromise, - this.getGasFeeValues(buildUseropDto?.overrides, buildUseropDto?.skipBundlerGasEstimation), ]); if (transactions.length === 0) { throw new Error("Transactions array cannot be empty"); } - let callData = ""; + let callData: Hex = "0x"; if (transactions.length > 1 || buildUseropDto?.forceEncodeForBatch) { callData = await this.encodeExecuteBatch(to, value, data); } else { @@ -479,47 +880,44 @@ export class BiconomySmartAccountV2 extends BaseSmartAccount { callData = await this.encodeExecute(to[0], value[0], data[0]); } - let userOp: Partial = { - sender: await this.getAccountAddress(), - nonce: nonceFromFetch, + let userOp: Partial = { + sender: (await this.getAccountAddress()) as Hex, + nonce: toHex(nonceFromFetch), initCode, callData: callData, - maxFeePerGas: finalGasFeeValue.maxFeePerGas || undefined, - maxPriorityFeePerGas: finalGasFeeValue.maxPriorityFeePerGas || undefined, }; // for this Smart Account current validation module dummy signature will be used to estimate gas userOp.signature = signature; // Note: Can change the default behaviour of calling estimations using bundler/local - userOp = await this.estimateUserOpGas({ - userOp, - overrides: buildUseropDto?.overrides, - skipBundlerGasEstimation: buildUseropDto?.skipBundlerGasEstimation, - paymasterServiceData: buildUseropDto?.paymasterServiceData, - }); - userOp.paymasterAndData = userOp.paymasterAndData ?? "0x"; + userOp = await this.estimateUserOpGas(userOp); + + if (buildUseropDto?.paymasterServiceData) { + userOp = await this.getPaymasterUserOp(userOp, buildUseropDto.paymasterServiceData); + } + Logger.log("UserOp after estimation ", userOp); return userOp; } - private validateUserOpAndPaymasterRequest(userOp: Partial, tokenPaymasterRequest: BiconomyTokenPaymasterRequest): void { + private validateUserOpAndPaymasterRequest(userOp: Partial, tokenPaymasterRequest: BiconomyTokenPaymasterRequest): void { if (isNullOrUndefined(userOp.callData)) { throw new Error("UserOp callData cannot be undefined"); } const feeTokenAddress = tokenPaymasterRequest?.feeQuote?.tokenAddress; - Logger.log("Requested fee token is ", feeTokenAddress); + Logger.warn("Requested fee token is ", feeTokenAddress); - if (!feeTokenAddress || feeTokenAddress == ethers.constants.AddressZero) { + if (!feeTokenAddress || feeTokenAddress === ADDRESS_ZERO) { throw new Error("Invalid or missing token address. Token address must be part of the feeQuote in tokenPaymasterRequest"); } const spender = tokenPaymasterRequest?.spender; - Logger.log("Spender address is ", spender); + Logger.warn("Spender address is ", spender); - if (!spender || spender == ethers.constants.AddressZero) { + if (!spender || spender === ADDRESS_ZERO) { throw new Error("Invalid or missing spender address. Sepnder address must be part of tokenPaymasterRequest"); } } @@ -534,29 +932,28 @@ export class BiconomySmartAccountV2 extends BaseSmartAccount { * @returns updated userOp with new callData, callGasLimit */ async buildTokenPaymasterUserOp( - userOp: Partial, + userOp: Partial, tokenPaymasterRequest: BiconomyTokenPaymasterRequest, - ): Promise> { + ): Promise> { this.validateUserOpAndPaymasterRequest(userOp, tokenPaymasterRequest); try { - let batchTo: Array = []; - let batchValue: Array = []; - let batchData: Array = []; + let batchTo: Array = []; + let batchValue: Array = []; + let batchData: Array = []; let newCallData = userOp.callData; - Logger.log("Received information about fee token address and quote ", tokenPaymasterRequest); + Logger.warn("Received information about fee token address and quote ", tokenPaymasterRequest); - if (this.paymaster && this.paymaster instanceof BiconomyPaymaster) { + if (this.paymaster && this.paymaster instanceof Paymaster) { // Make a call to paymaster.buildTokenApprovalTransaction() with necessary details // Review: might request this form of an array of Transaction const approvalRequest: Transaction = await (this.paymaster as IHybridPaymaster).buildTokenApprovalTransaction( tokenPaymasterRequest, - this.provider, ); - Logger.log("ApprovalRequest is for erc20 token ", approvalRequest.to); + Logger.warn("ApprovalRequest is for erc20 token ", approvalRequest.to); - if (approvalRequest.data == "0x" || approvalRequest.to == ethers.constants.AddressZero) { + if (approvalRequest.data === "0x" || approvalRequest.to === ADDRESS_ZERO) { return userOp; } @@ -564,18 +961,18 @@ export class BiconomySmartAccountV2 extends BaseSmartAccount { throw new Error("UserOp callData cannot be undefined"); } - const account = await this._getAccountContract(); - - const decodedSmartAccountData = account.interface.parseTransaction({ - data: userOp.callData!.toString(), + const decodedSmartAccountData = decodeFunctionData({ + abi: BiconomyAccountAbi, + data: userOp.callData as Hex, }); + if (!decodedSmartAccountData) { throw new Error("Could not parse userOp call data for this smart account"); } - const smartAccountExecFunctionName = decodedSmartAccountData.name; + const smartAccountExecFunctionName = decodedSmartAccountData.functionName; - Logger.log(`Originally an ${smartAccountExecFunctionName} method call for Biconomy Account V2`); + Logger.warn(`Originally an ${smartAccountExecFunctionName} method call for Biconomy Account V2`); if (smartAccountExecFunctionName === "execute" || smartAccountExecFunctionName === "execute_ncC") { const methodArgsSmartWalletExecuteCall = decodedSmartAccountData.args; const toOriginal = methodArgsSmartWalletExecuteCall[0]; @@ -587,23 +984,25 @@ export class BiconomySmartAccountV2 extends BaseSmartAccount { batchData.push(dataOriginal); } else if (smartAccountExecFunctionName === "executeBatch" || smartAccountExecFunctionName === "executeBatch_y6U") { const methodArgsSmartWalletExecuteCall = decodedSmartAccountData.args; - batchTo = methodArgsSmartWalletExecuteCall[0]; - batchValue = methodArgsSmartWalletExecuteCall[1]; - batchData = methodArgsSmartWalletExecuteCall[2]; + batchTo = [...methodArgsSmartWalletExecuteCall[0]]; + batchValue = [...methodArgsSmartWalletExecuteCall[1]]; + batchData = [...methodArgsSmartWalletExecuteCall[2]]; } if (approvalRequest.to && approvalRequest.data && approvalRequest.value) { - batchTo = [approvalRequest.to, ...batchTo]; - batchValue = [approvalRequest.value, ...batchValue]; - batchData = [approvalRequest.data, ...batchData]; + batchTo = [approvalRequest.to as Hex, ...batchTo]; + batchValue = [BigInt(Number(approvalRequest.value.toString())), ...batchValue]; + batchData = [approvalRequest.data as Hex, ...batchData]; newCallData = await this.encodeExecuteBatch(batchTo, batchValue, batchData); } - const finalUserOp: Partial = { + const finalUserOp: Partial = { ...userOp, callData: newCallData, }; + // Optionally Requesting to update gas limits again (especially callGasLimit needs to be re-calculated) + return finalUserOp; } } catch (error) { @@ -614,125 +1013,98 @@ export class BiconomySmartAccountV2 extends BaseSmartAccount { return userOp; } - async signUserOpHash(userOpHash: string, params?: SendUserOpParams): Promise { + async signUserOpHash(userOpHash: string, params?: ModuleInfo): Promise { this.isActiveValidationModuleDefined(); - const moduleSig = await this.activeValidationModule.signUserOpHash(userOpHash, params); + const moduleSig = (await this.activeValidationModule.signUserOpHash(userOpHash, params)) as Hex; - const signatureWithModuleAddress = ethers.utils.defaultAbiCoder.encode( - ["bytes", "address"], - [moduleSig, this.activeValidationModule.getAddress()], - ); + const signatureWithModuleAddress = encodeAbiParameters(parseAbiParameters("bytes, address"), [ + moduleSig, + this.activeValidationModule.getAddress() as Hex, + ]); return signatureWithModuleAddress; } - async signMessage(message: Bytes | string): Promise { + async signMessage(message: string | Uint8Array): Promise { this.isActiveValidationModuleDefined(); - const dataHash = ethers.utils.arrayify(ethers.utils.hashMessage(message)); + const dataHash = typeof message === "string" ? toBytes(message) : message; let signature = await this.activeValidationModule.signMessage(dataHash); + const potentiallyIncorrectV = parseInt(signature.slice(-2), 16); + if (![27, 28].includes(potentiallyIncorrectV)) { + const correctV = potentiallyIncorrectV + 27; + signature = signature.slice(0, -2) + correctV.toString(16); + } if (signature.slice(0, 2) !== "0x") { signature = "0x" + signature; } - - // If the account is undeployed, use ERC-6492 - if (!(await this.isAccountDeployed(await this.getAccountAddress()))) { - const coder = new ethers.utils.AbiCoder(); - const populatedTransaction = await this.factory?.populateTransaction.deployCounterFactualAccount( - await this.defaultValidationModule.getAddress(), - await this.defaultValidationModule.getInitData(), - this.index, - ); - signature = - coder.encode(["address", "bytes", "bytes"], [this.factoryAddress, populatedTransaction?.data, signature]) + - "6492649264926492649264926492649264926492649264926492649264926492"; // magic suffix - } - return signature; - } - - async getAllTokenBalances(balancesDto: BalancesDto): Promise { - return this.nodeClient.getAllTokenBalances(balancesDto); + return signature as Hex; } - async getTotalBalanceInUsd(balancesDto: BalancesDto): Promise { - return this.nodeClient.getTotalBalanceInUsd(balancesDto); - } - - async getSmartAccountsByOwner(smartAccountByOwnerDto: SmartAccountByOwnerDto): Promise { - return this.nodeClient.getSmartAccountsByOwner(smartAccountByOwnerDto); - } - - async getTransactionsByAddress(chainId: number, address: string): Promise { - return this.nodeClient.getTransactionByAddress(chainId, address); - } - - async getTransactionByHash(txHash: string): Promise { - return this.nodeClient.getTransactionByHash(txHash); - } - - async getAllSupportedChains(): Promise { - return this.nodeClient.getAllSupportedChains(); - } - - getImplementationAddress(): string { - return this.implementationAddress; - } - - async enableModule(moduleAddress: string): Promise { + async enableModule(moduleAddress: Hex): Promise { const tx: Transaction = await this.getEnableModuleData(moduleAddress); const partialUserOp = await this.buildUserOp([tx]); return this.sendUserOp(partialUserOp); } - async getEnableModuleData(moduleAddress: string): Promise { - const accountContract = await this._getAccountContract(); - const data = accountContract.interface.encodeFunctionData("enableModule", [moduleAddress]); + async getEnableModuleData(moduleAddress: Hex): Promise { + const callData = encodeFunctionData({ + abi: BiconomyAccountAbi, + functionName: "enableModule", + args: [moduleAddress], + }); const tx: Transaction = { - to: await this.getAccountAddress(), - value: "0", - data: data as string, + to: await this.getAddress(), + value: "0x00", + data: callData, }; return tx; } - async getSetupAndEnableModuleData(moduleAddress: string, moduleSetupData: string): Promise { - const accountContract = await this._getAccountContract(); - const data = accountContract.interface.encodeFunctionData("setupAndEnableModule", [moduleAddress, moduleSetupData]); + async getSetupAndEnableModuleData(moduleAddress: Hex, moduleSetupData: Hex): Promise { + const callData = encodeFunctionData({ + abi: BiconomyAccountAbi, + functionName: "setupAndEnableModule", + args: [moduleAddress, moduleSetupData], + }); const tx: Transaction = { - to: await this.getAccountAddress(), - value: "0", - data: data, + to: await this.getAddress(), + value: "0x00", + data: callData, }; return tx; } - async disableModule(prevModule: string, moduleAddress: string): Promise { + async disableModule(prevModule: Hex, moduleAddress: Hex): Promise { const tx: Transaction = await this.getDisableModuleData(prevModule, moduleAddress); const partialUserOp = await this.buildUserOp([tx]); return this.sendUserOp(partialUserOp); } - async getDisableModuleData(prevModule: string, moduleAddress: string): Promise { - const accountContract = await this._getAccountContract(); - const data = accountContract.interface.encodeFunctionData("disableModule", [prevModule, moduleAddress]); + async getDisableModuleData(prevModule: Hex, moduleAddress: Hex): Promise { + const callData = encodeFunctionData({ + abi: BiconomyAccountAbi, + functionName: "disableModule", + args: [prevModule, moduleAddress], + }); const tx: Transaction = { - to: await this.getAccountAddress(), - value: "0", - data: data, + to: await this.getAddress(), + value: "0x00", + data: callData, }; return tx; } - async isModuleEnabled(moduleName: string): Promise { + async isModuleEnabled(moduleAddress: Hex): Promise { const accountContract = await this._getAccountContract(); - return accountContract.isModuleEnabled(moduleName); + return accountContract.read.isModuleEnabled([moduleAddress]); } + // Review async getAllModules(pageSize?: number): Promise> { pageSize = pageSize ?? 100; const accountContract = await this._getAccountContract(); - // Note: If page size is lower then on the next page start module would be module at the end of first page and not SENTINEL_MODULE - const result: Array> = await accountContract.getModulesPaginated(this.SENTINEL_MODULE, pageSize); + const result = await accountContract.read.getModulesPaginated([this.SENTINEL_MODULE as Hex, BigInt(pageSize)]); const modules: Array = result[0] as Array; return modules; } diff --git a/packages/account/src/SmartAccount.ts b/packages/account/src/SmartAccount.ts deleted file mode 100644 index 7ca709e97..000000000 --- a/packages/account/src/SmartAccount.ts +++ /dev/null @@ -1,314 +0,0 @@ -import { JsonRpcProvider } from "@ethersproject/providers"; -import { BigNumber, Signer, BytesLike } from "ethers"; -import { ISmartAccount } from "./interfaces/ISmartAccount"; -import { defaultAbiCoder, keccak256, arrayify } from "ethers/lib/utils"; -import { UserOperation, ChainId } from "@biconomy/core-types"; -import { calcPreVerificationGas, DefaultGasLimits } from "./utils/Preverificaiton"; -import { packUserOp, isNullOrUndefined } from "@biconomy/common"; - -import { IBundler, UserOpResponse } from "@biconomy/bundler"; -import { IPaymaster, PaymasterAndDataResponse } from "@biconomy/paymaster"; -import { Logger } from "@biconomy/common"; -import { IEntryPoint } from "@account-abstraction/contracts"; -import { SponsorUserOperationDto, BiconomyPaymaster, IHybridPaymaster, PaymasterMode } from "@biconomy/paymaster"; -import { SmartAccountConfig, SendUserOpDto, EstimateUserOpGasParams } from "./utils/Types"; -import { DefaultGasLimit } from "./utils/Constants"; - -type UserOperationKey = keyof UserOperation; - -// Notice: only to be used as base class for child class BiconomySmartAccount(V1) -export abstract class SmartAccount implements ISmartAccount { - bundler!: IBundler; - - paymaster!: IPaymaster; - - initCode = "0x"; - - // Ideally proxy should be defined in child class, if it's meant to be of type Biconomy SmartAccount - proxy!: any; - - owner!: string; - - provider!: JsonRpcProvider; - - entryPoint!: IEntryPoint; - - chainId!: ChainId; - - signer!: Signer; - - smartAccountConfig: SmartAccountConfig; - - constructor(_smartAccountConfig: SmartAccountConfig) { - this.smartAccountConfig = _smartAccountConfig; - } - - setEntryPointAddress(entryPointAddress: string): void { - this.smartAccountConfig.entryPointAddress = entryPointAddress; - } - - private validateUserOp(userOp: Partial, requiredFields: UserOperationKey[]): boolean { - for (const field of requiredFields) { - if (isNullOrUndefined(userOp[field])) { - throw new Error(`${String(field)} is missing in the UserOp`); - } - } - return true; - } - - isProxyDefined(): boolean { - if (!this.proxy) throw new Error("Proxy is undefined"); - - return true; - } - - isSignerDefined(): boolean { - if (!this.signer) throw new Error("Signer is undefined"); - - return true; - } - - isProviderDefined(): boolean { - if (!this.provider) throw new Error("Provider is undefined"); - - return true; - } - - abstract getDummySignature(): string; - - async calculateUserOpGasValues(userOp: Partial): Promise> { - if (!this.provider) throw new Error("Provider is not present for making rpc calls"); - const feeData = await this.provider.getFeeData(); - userOp.maxFeePerGas = userOp.maxFeePerGas ?? feeData.maxFeePerGas ?? feeData.gasPrice ?? (await this.provider.getGasPrice()); - userOp.maxPriorityFeePerGas = - userOp.maxPriorityFeePerGas ?? feeData.maxPriorityFeePerGas ?? feeData.gasPrice ?? (await this.provider.getGasPrice()); - if (userOp.initCode) - userOp.verificationGasLimit = - userOp.verificationGasLimit !== null || userOp.verificationGasLimit !== undefined - ? userOp.verificationGasLimit - : await this.getVerificationGasLimit(userOp.initCode); - userOp.callGasLimit = - userOp.callGasLimit !== null || userOp.callGasLimit !== undefined - ? userOp.callGasLimit - : await this.provider.estimateGas({ - from: this.smartAccountConfig.entryPointAddress, - to: userOp.sender, - data: userOp.callData, - }); - userOp.preVerificationGas = - userOp.preVerificationGas !== null || userOp.preVerificationGas !== undefined ? userOp.preVerificationGas : this.getPreVerificationGas(userOp); - return userOp; - } - - async estimateUserOpGas(params: EstimateUserOpGasParams): Promise> { - let userOp = params.userOp; - const { overrides, skipBundlerGasEstimation, paymasterServiceData } = params; - const requiredFields: UserOperationKey[] = ["sender", "nonce", "initCode", "callData"]; - this.validateUserOp(userOp, requiredFields); - - let finalUserOp = userOp; - const skipBundlerCall = skipBundlerGasEstimation ?? true; - // Override gas values in userOp if provided in overrides params - if (overrides) { - userOp = { ...userOp, ...overrides }; - } - - Logger.log("userOp in estimation", userOp); - - if (skipBundlerCall) { - if (this.paymaster && this.paymaster instanceof BiconomyPaymaster) { - if (isNullOrUndefined(userOp.maxFeePerGas) || isNullOrUndefined(userOp.maxPriorityFeePerGas)) { - throw new Error("maxFeePerGas and maxPriorityFeePerGas are required for skipBundlerCall mode"); - } - if (paymasterServiceData?.mode === PaymasterMode.SPONSORED) { - const v1BiconomyInfo = { - name: "BICONOMY", - version: "1.0.0", - }; - const smartAccountInfo = paymasterServiceData?.smartAccountInfo ?? v1BiconomyInfo; - paymasterServiceData.smartAccountInfo = smartAccountInfo; - - // Making call to paymaster to get gas estimations for userOp - const { callGasLimit, verificationGasLimit, preVerificationGas, paymasterAndData } = await ( - this.paymaster as IHybridPaymaster - ).getPaymasterAndData(userOp, paymasterServiceData); - if (paymasterAndData === "0x" && (callGasLimit === undefined || verificationGasLimit === undefined || preVerificationGas === undefined)) { - throw new Error("Since you intend to use sponsorship paymaster, please check and make sure policies are set on the dashboard"); - } - finalUserOp.verificationGasLimit = verificationGasLimit ?? userOp.verificationGasLimit; - finalUserOp.callGasLimit = callGasLimit ?? userOp.callGasLimit; - finalUserOp.preVerificationGas = preVerificationGas ?? userOp.preVerificationGas; - finalUserOp.paymasterAndData = paymasterAndData ?? userOp.paymasterAndData; - } else { - // use dummy values for gas limits as fee quote call will ignore this later. - finalUserOp.callGasLimit = DefaultGasLimit.callGasLimit; - finalUserOp.verificationGasLimit = DefaultGasLimit.verificationGasLimit; - finalUserOp.preVerificationGas = DefaultGasLimit.preVerificationGas; - } - } else { - Logger.warn("Skipped paymaster call. If you are using paymasterAndData, generate data externally"); - finalUserOp = await this.calculateUserOpGasValues(userOp); - finalUserOp.paymasterAndData = "0x"; - } - } else { - if (!this.bundler) throw new Error("Bundler is not provided"); - delete userOp.maxFeePerGas; - delete userOp.maxPriorityFeePerGas; - // Making call to bundler to get gas estimations for userOp - const { callGasLimit, verificationGasLimit, preVerificationGas, maxFeePerGas, maxPriorityFeePerGas } = - await this.bundler.estimateUserOpGas(userOp); - // if neither user sent gas fee nor the bundler, estimate gas from provider - if ( - isNullOrUndefined(userOp.maxFeePerGas) && - isNullOrUndefined(userOp.maxPriorityFeePerGas) && - (isNullOrUndefined(maxFeePerGas) || isNullOrUndefined(maxPriorityFeePerGas)) - ) { - const feeData = await this.provider.getFeeData(); - finalUserOp.maxFeePerGas = feeData.maxFeePerGas ?? feeData.gasPrice ?? (await this.provider.getGasPrice()); - finalUserOp.maxPriorityFeePerGas = feeData.maxPriorityFeePerGas ?? feeData.gasPrice ?? (await this.provider.getGasPrice()); - } else { - finalUserOp.maxFeePerGas = maxFeePerGas ?? userOp.maxFeePerGas; - finalUserOp.maxPriorityFeePerGas = maxPriorityFeePerGas ?? userOp.maxPriorityFeePerGas; - } - finalUserOp.verificationGasLimit = verificationGasLimit ?? userOp.verificationGasLimit; - finalUserOp.callGasLimit = callGasLimit ?? userOp.callGasLimit; - finalUserOp.preVerificationGas = preVerificationGas ?? userOp.preVerificationGas; - finalUserOp.paymasterAndData = "0x"; - } - return finalUserOp; - } - - async isAccountDeployed(address: string): Promise { - this.isProviderDefined(); - const contractCode = await this.provider.getCode(address); - return contractCode !== "0x"; - } - - // Would only be used if paymaster is attached - async getPaymasterAndData(userOp: Partial): Promise { - if (this.paymaster) { - const paymasterAndDataResponse: PaymasterAndDataResponse = await this.paymaster.getPaymasterAndData(userOp); - return paymasterAndDataResponse.paymasterAndData; - } - return "0x"; - } - - nonce(): Promise { - this.isProxyDefined(); - return this.proxy.nonce(); - } - - async signUserOpHash(userOpHash: string, signer?: Signer): Promise { - if (signer) { - return signer.signMessage(arrayify(userOpHash)); - } - if (this.signer) { - return this.signer.signMessage(arrayify(userOpHash)); - } - throw new Error("No signer provided to sign userOp"); - } - - getPreVerificationGas(userOp: Partial): BigNumber { - return calcPreVerificationGas(userOp); - } - - async getVerificationGasLimit(initCode: BytesLike): Promise { - // Verification gas should be max(initGas(wallet deployment) + validateUserOp + validatePaymasterUserOp , postOp) - - const initGas = await this.estimateCreationGas(initCode as string); - const validateUserOpGas = BigNumber.from(DefaultGasLimits.validatePaymasterUserOpGas + DefaultGasLimits.validateUserOpGas); - const postOpGas = BigNumber.from(DefaultGasLimits.postOpGas); - - let verificationGasLimit = BigNumber.from(validateUserOpGas).add(initGas); - - if (BigNumber.from(postOpGas).gt(verificationGasLimit)) { - verificationGasLimit = postOpGas; - } - return verificationGasLimit; - } - - async getUserOpHash(userOp: Partial): Promise { - const userOpHash = keccak256(packUserOp(userOp, true)); - const enc = defaultAbiCoder.encode(["bytes32", "address", "uint256"], [userOpHash, this.entryPoint.address, this.chainId]); - return keccak256(enc); - } - - abstract getSmartAccountAddress(_accountIndex: number): Promise; - - async estimateCreationGas(initCode: string): Promise { - if (initCode == null || initCode === "0x") return BigNumber.from("0"); - const deployerAddress = initCode.substring(0, 42); - const deployerCallData = "0x" + initCode.substring(42); - return this.provider.estimateGas({ to: deployerAddress, data: deployerCallData }); - } - - async signUserOp(userOp: Partial): Promise { - const requiredFields: UserOperationKey[] = [ - "sender", - "nonce", - "initCode", - "callData", - "callGasLimit", - "verificationGasLimit", - "preVerificationGas", - "maxFeePerGas", - "maxPriorityFeePerGas", - "paymasterAndData", - ]; - this.validateUserOp(userOp, requiredFields); - const userOpHash = await this.getUserOpHash(userOp); - let signature = await this.signUserOpHash(userOpHash, this.signer); - const potentiallyIncorrectV = parseInt(signature.slice(-2), 16); - if (![27, 28].includes(potentiallyIncorrectV)) { - const correctV = potentiallyIncorrectV + 27; - signature = signature.slice(0, -2) + correctV.toString(16); - } - if (signature.slice(0, 2) !== "0x") { - signature = "0x" + signature; - } - userOp.signature = signature; - return userOp as UserOperation; - } - - /** - * - * @param userOp - * @description This function call will take 'unsignedUserOp' as an input, sign it with the owner key, and send it to the bundler. - * @returns Promise - */ - async sendUserOp(userOp: Partial, params?: SendUserOpDto): Promise { - Logger.log("userOp received in base account ", userOp); - delete userOp.signature; - const userOperation = await this.signUserOp(userOp); - const bundlerResponse = await this.sendSignedUserOp(userOperation, params); - return bundlerResponse; - } - - /** - * - * @param userOp - * @description This function call will take 'signedUserOp' as input and send it to the bundler - * @returns - */ - async sendSignedUserOp(userOp: UserOperation, params?: SendUserOpDto): Promise { - const requiredFields: UserOperationKey[] = [ - "sender", - "nonce", - "initCode", - "callData", - "callGasLimit", - "verificationGasLimit", - "preVerificationGas", - "maxFeePerGas", - "maxPriorityFeePerGas", - "paymasterAndData", - "signature", - ]; - this.validateUserOp(userOp, requiredFields); - Logger.log("userOp validated"); - if (!this.bundler) throw new Error("Bundler is not provided"); - Logger.log("userOp being sent to the bundler", userOp); - const bundlerResponse = await this.bundler.sendUserOp(userOp, params?.simulationType); - return bundlerResponse; - } -} diff --git a/packages/account/src/abi/AccountResolver.ts b/packages/account/src/abi/AccountResolver.ts new file mode 100644 index 000000000..0cbffc749 --- /dev/null +++ b/packages/account/src/abi/AccountResolver.ts @@ -0,0 +1,106 @@ +export const AccountResolverAbi = [ + { + inputs: [ + { internalType: "address", name: "_v1Factory", type: "address" }, + { internalType: "address", name: "_v2Factory", type: "address" }, + { internalType: "address", name: "_ecdsaModule", type: "address" }, + ], + stateMutability: "nonpayable", + type: "constructor", + }, + { + inputs: [], + name: "ecdsaOwnershipModule", + outputs: [{ internalType: "address", name: "", type: "address" }], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { internalType: "address", name: "_eoa", type: "address" }, + { internalType: "uint8", name: "_maxIndex", type: "uint8" }, + ], + name: "resolveAddresses", + outputs: [ + { + components: [ + { internalType: "address", name: "accountAddress", type: "address" }, + { internalType: "address", name: "factoryAddress", type: "address" }, + { internalType: "address", name: "currentImplementation", type: "address" }, + { internalType: "string", name: "currentVersion", type: "string" }, + { internalType: "string", name: "factoryVersion", type: "string" }, + { internalType: "uint256", name: "deploymentIndex", type: "uint256" }, + ], + internalType: "struct IAddressResolver.SmartAccountResult[]", + name: "", + type: "tuple[]", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { internalType: "address", name: "_eoa", type: "address" }, + { internalType: "uint8", name: "_maxIndex", type: "uint8" }, + { internalType: "address", name: "_moduleAddress", type: "address" }, + { internalType: "bytes", name: "_moduleSetupData", type: "bytes" }, + ], + name: "resolveAddressesFlexibleForV2", + outputs: [ + { + components: [ + { internalType: "address", name: "accountAddress", type: "address" }, + { internalType: "address", name: "factoryAddress", type: "address" }, + { internalType: "address", name: "currentImplementation", type: "address" }, + { internalType: "string", name: "currentVersion", type: "string" }, + { internalType: "string", name: "factoryVersion", type: "string" }, + { internalType: "uint256", name: "deploymentIndex", type: "uint256" }, + ], + internalType: "struct IAddressResolver.SmartAccountResult[]", + name: "", + type: "tuple[]", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { internalType: "address", name: "_eoa", type: "address" }, + { internalType: "uint8", name: "_maxIndex", type: "uint8" }, + ], + name: "resolveAddressesV1", + outputs: [ + { + components: [ + { internalType: "address", name: "accountAddress", type: "address" }, + { internalType: "address", name: "factoryAddress", type: "address" }, + { internalType: "address", name: "currentImplementation", type: "address" }, + { internalType: "string", name: "currentVersion", type: "string" }, + { internalType: "string", name: "factoryVersion", type: "string" }, + { internalType: "uint256", name: "deploymentIndex", type: "uint256" }, + ], + internalType: "struct IAddressResolver.SmartAccountResult[]", + name: "", + type: "tuple[]", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "smartAccountFactoryV1", + outputs: [{ internalType: "address", name: "", type: "address" }], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "smartAccountFactoryV2", + outputs: [{ internalType: "address", name: "", type: "address" }], + stateMutability: "view", + type: "function", + }, +] as const; diff --git a/packages/account/src/abi/Factory.ts b/packages/account/src/abi/Factory.ts new file mode 100644 index 000000000..3498dd958 --- /dev/null +++ b/packages/account/src/abi/Factory.ts @@ -0,0 +1,141 @@ +export const BiconomyFactoryAbi = [ + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address", + name: "account", + type: "address", + }, + { + indexed: true, + internalType: "address", + name: "initialAuthModule", + type: "address", + }, + { + indexed: true, + internalType: "uint256", + name: "index", + type: "uint256", + }, + ], + name: "AccountCreation", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address", + name: "account", + type: "address", + }, + { + indexed: true, + internalType: "address", + name: "initialAuthModule", + type: "address", + }, + ], + name: "AccountCreationWithoutIndex", + type: "event", + }, + { + inputs: [], + name: "accountCreationCode", + outputs: [ + { + internalType: "bytes", + name: "", + type: "bytes", + }, + ], + stateMutability: "pure", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "moduleSetupContract", + type: "address", + }, + { + internalType: "bytes", + name: "moduleSetupData", + type: "bytes", + }, + ], + name: "deployAccount", + outputs: [ + { + internalType: "address", + name: "proxy", + type: "address", + }, + ], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "moduleSetupContract", + type: "address", + }, + { + internalType: "bytes", + name: "moduleSetupData", + type: "bytes", + }, + { + internalType: "uint256", + name: "index", + type: "uint256", + }, + ], + name: "deployCounterFactualAccount", + outputs: [ + { + internalType: "address", + name: "proxy", + type: "address", + }, + ], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "moduleSetupContract", + type: "address", + }, + { + internalType: "bytes", + name: "moduleSetupData", + type: "bytes", + }, + { + internalType: "uint256", + name: "index", + type: "uint256", + }, + ], + name: "getAddressForCounterFactualAccount", + outputs: [ + { + internalType: "address", + name: "_account", + type: "address", + }, + ], + stateMutability: "view", + type: "function", + }, +] as const; diff --git a/packages/account/src/abi/SmartAccount.ts b/packages/account/src/abi/SmartAccount.ts new file mode 100644 index 000000000..3542c17d1 --- /dev/null +++ b/packages/account/src/abi/SmartAccount.ts @@ -0,0 +1,944 @@ +export const BiconomyAccountAbi = [ + { + inputs: [], + name: "AlreadyInitialized", + type: "error", + }, + { + inputs: [], + name: "BaseImplementationCannotBeZero", + type: "error", + }, + { + inputs: [ + { + internalType: "address", + name: "caller", + type: "address", + }, + ], + name: "CallerIsNotAnEntryPoint", + type: "error", + }, + { + inputs: [ + { + internalType: "address", + name: "caller", + type: "address", + }, + ], + name: "CallerIsNotEntryPoint", + type: "error", + }, + { + inputs: [ + { + internalType: "address", + name: "caller", + type: "address", + }, + ], + name: "CallerIsNotEntryPointOrOwner", + type: "error", + }, + { + inputs: [ + { + internalType: "address", + name: "caller", + type: "address", + }, + ], + name: "CallerIsNotEntryPointOrSelf", + type: "error", + }, + { + inputs: [ + { + internalType: "address", + name: "caller", + type: "address", + }, + ], + name: "CallerIsNotOwner", + type: "error", + }, + { + inputs: [], + name: "DelegateCallsOnly", + type: "error", + }, + { + inputs: [], + name: "EntryPointCannotBeZero", + type: "error", + }, + { + inputs: [ + { + internalType: "address", + name: "implementationAddress", + type: "address", + }, + ], + name: "InvalidImplementation", + type: "error", + }, + { + inputs: [ + { + internalType: "address", + name: "caller", + type: "address", + }, + ], + name: "MixedAuthFail", + type: "error", + }, + { + inputs: [ + { + internalType: "address", + name: "module", + type: "address", + }, + ], + name: "ModuleAlreadyEnabled", + type: "error", + }, + { + inputs: [ + { + internalType: "address", + name: "expectedModule", + type: "address", + }, + { + internalType: "address", + name: "returnedModule", + type: "address", + }, + { + internalType: "address", + name: "prevModule", + type: "address", + }, + ], + name: "ModuleAndPrevModuleMismatch", + type: "error", + }, + { + inputs: [ + { + internalType: "address", + name: "module", + type: "address", + }, + ], + name: "ModuleCannotBeZeroOrSentinel", + type: "error", + }, + { + inputs: [ + { + internalType: "address", + name: "module", + type: "address", + }, + ], + name: "ModuleNotEnabled", + type: "error", + }, + { + inputs: [], + name: "ModulesAlreadyInitialized", + type: "error", + }, + { + inputs: [], + name: "ModulesSetupExecutionFailed", + type: "error", + }, + { + inputs: [], + name: "OwnerCanNotBeSelf", + type: "error", + }, + { + inputs: [], + name: "OwnerCannotBeZero", + type: "error", + }, + { + inputs: [], + name: "OwnerProvidedIsSame", + type: "error", + }, + { + inputs: [], + name: "TransferToZeroAddressAttempt", + type: "error", + }, + { + inputs: [ + { + internalType: "uint256", + name: "destLength", + type: "uint256", + }, + { + internalType: "uint256", + name: "valueLength", + type: "uint256", + }, + { + internalType: "uint256", + name: "funcLength", + type: "uint256", + }, + { + internalType: "uint256", + name: "operationLength", + type: "uint256", + }, + ], + name: "WrongBatchProvided", + type: "error", + }, + { + inputs: [ + { + internalType: "bytes", + name: "contractSignature", + type: "bytes", + }, + ], + name: "WrongContractSignature", + type: "error", + }, + { + inputs: [ + { + internalType: "uint256", + name: "uintS", + type: "uint256", + }, + { + internalType: "uint256", + name: "contractSignatureLength", + type: "uint256", + }, + { + internalType: "uint256", + name: "signatureLength", + type: "uint256", + }, + ], + name: "WrongContractSignatureFormat", + type: "error", + }, + { + inputs: [ + { + internalType: "address", + name: "moduleAddressProvided", + type: "address", + }, + ], + name: "WrongValidationModule", + type: "error", + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "address", + name: "module", + type: "address", + }, + ], + name: "DisabledModule", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "address", + name: "module", + type: "address", + }, + ], + name: "EnabledModule", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address", + name: "module", + type: "address", + }, + ], + name: "ExecutionFromModuleFailure", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address", + name: "module", + type: "address", + }, + ], + name: "ExecutionFromModuleSuccess", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address", + name: "oldImplementation", + type: "address", + }, + { + indexed: true, + internalType: "address", + name: "newImplementation", + type: "address", + }, + ], + name: "ImplementationUpdated", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "address", + name: "module", + type: "address", + }, + { + indexed: false, + internalType: "address", + name: "to", + type: "address", + }, + { + indexed: false, + internalType: "uint256", + name: "value", + type: "uint256", + }, + { + indexed: false, + internalType: "bytes", + name: "data", + type: "bytes", + }, + { + indexed: false, + internalType: "enum Enum.Operation", + name: "operation", + type: "uint8", + }, + ], + name: "ModuleTransaction", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address", + name: "sender", + type: "address", + }, + { + indexed: true, + internalType: "uint256", + name: "value", + type: "uint256", + }, + ], + name: "SmartAccountReceivedNativeToken", + type: "event", + }, + { + inputs: [], + name: "VERSION", + outputs: [ + { + internalType: "string", + name: "", + type: "string", + }, + ], + stateMutability: "pure", + type: "function", + }, + { + inputs: [], + name: "addDeposit", + outputs: [], + stateMutability: "payable", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "prevModule", + type: "address", + }, + { + internalType: "address", + name: "module", + type: "address", + }, + ], + name: "disableModule", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "module", + type: "address", + }, + ], + name: "enableModule", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [], + name: "entryPoint", + outputs: [ + { + internalType: "contract IEntryPoint", + name: "", + type: "address", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "address[]", + name: "to", + type: "address[]", + }, + { + internalType: "uint256[]", + name: "value", + type: "uint256[]", + }, + { + internalType: "bytes[]", + name: "data", + type: "bytes[]", + }, + { + internalType: "enum Enum.Operation[]", + name: "operations", + type: "uint8[]", + }, + ], + name: "execBatchTransactionFromModule", + outputs: [ + { + internalType: "bool", + name: "success", + type: "bool", + }, + ], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "to", + type: "address", + }, + { + internalType: "uint256", + name: "value", + type: "uint256", + }, + { + internalType: "bytes", + name: "data", + type: "bytes", + }, + { + internalType: "enum Enum.Operation", + name: "operation", + type: "uint8", + }, + { + internalType: "uint256", + name: "txGas", + type: "uint256", + }, + ], + name: "execTransactionFromModule", + outputs: [ + { + internalType: "bool", + name: "success", + type: "bool", + }, + ], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "to", + type: "address", + }, + { + internalType: "uint256", + name: "value", + type: "uint256", + }, + { + internalType: "bytes", + name: "data", + type: "bytes", + }, + { + internalType: "enum Enum.Operation", + name: "operation", + type: "uint8", + }, + ], + name: "execTransactionFromModule", + outputs: [ + { + internalType: "bool", + name: "", + type: "bool", + }, + ], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "to", + type: "address", + }, + { + internalType: "uint256", + name: "value", + type: "uint256", + }, + { + internalType: "bytes", + name: "data", + type: "bytes", + }, + { + internalType: "enum Enum.Operation", + name: "operation", + type: "uint8", + }, + ], + name: "execTransactionFromModuleReturnData", + outputs: [ + { + internalType: "bool", + name: "success", + type: "bool", + }, + { + internalType: "bytes", + name: "returnData", + type: "bytes", + }, + ], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "dest", + type: "address", + }, + { + internalType: "uint256", + name: "value", + type: "uint256", + }, + { + internalType: "bytes", + name: "func", + type: "bytes", + }, + ], + name: "execute", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "address[]", + name: "dest", + type: "address[]", + }, + { + internalType: "uint256[]", + name: "value", + type: "uint256[]", + }, + { + internalType: "bytes[]", + name: "func", + type: "bytes[]", + }, + ], + name: "executeBatch", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "address[]", + name: "dest", + type: "address[]", + }, + { + internalType: "uint256[]", + name: "value", + type: "uint256[]", + }, + { + internalType: "bytes[]", + name: "func", + type: "bytes[]", + }, + ], + name: "executeBatch_y6U", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "dest", + type: "address", + }, + { + internalType: "uint256", + name: "value", + type: "uint256", + }, + { + internalType: "bytes", + name: "func", + type: "bytes", + }, + ], + name: "execute_ncC", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [], + name: "getDeposit", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "getImplementation", + outputs: [ + { + internalType: "address", + name: "_implementation", + type: "address", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "start", + type: "address", + }, + { + internalType: "uint256", + name: "pageSize", + type: "uint256", + }, + ], + name: "getModulesPaginated", + outputs: [ + { + internalType: "address[]", + name: "array", + type: "address[]", + }, + { + internalType: "address", + name: "next", + type: "address", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "handler", + type: "address", + }, + { + internalType: "address", + name: "moduleSetupContract", + type: "address", + }, + { + internalType: "bytes", + name: "moduleSetupData", + type: "bytes", + }, + ], + name: "init", + outputs: [ + { + internalType: "address", + name: "", + type: "address", + }, + ], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "module", + type: "address", + }, + ], + name: "isModuleEnabled", + outputs: [ + { + internalType: "bool", + name: "", + type: "bool", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "uint192", + name: "_key", + type: "uint192", + }, + ], + name: "nonce", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "setupContract", + type: "address", + }, + { + internalType: "bytes", + name: "setupData", + type: "bytes", + }, + ], + name: "setupAndEnableModule", + outputs: [ + { + internalType: "address", + name: "", + type: "address", + }, + ], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "_implementation", + type: "address", + }, + ], + name: "updateImplementation", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + components: [ + { + internalType: "address", + name: "sender", + type: "address", + }, + { + internalType: "uint256", + name: "nonce", + type: "uint256", + }, + { + internalType: "bytes", + name: "initCode", + type: "bytes", + }, + { + internalType: "bytes", + name: "callData", + type: "bytes", + }, + { + internalType: "uint256", + name: "callGasLimit", + type: "uint256", + }, + { + internalType: "uint256", + name: "verificationGasLimit", + type: "uint256", + }, + { + internalType: "uint256", + name: "preVerificationGas", + type: "uint256", + }, + { + internalType: "uint256", + name: "maxFeePerGas", + type: "uint256", + }, + { + internalType: "uint256", + name: "maxPriorityFeePerGas", + type: "uint256", + }, + { + internalType: "bytes", + name: "paymasterAndData", + type: "bytes", + }, + { + internalType: "bytes", + name: "signature", + type: "bytes", + }, + ], + internalType: "struct UserOperation", + name: "userOp", + type: "tuple", + }, + { + internalType: "bytes32", + name: "userOpHash", + type: "bytes32", + }, + { + internalType: "uint256", + name: "missingAccountFunds", + type: "uint256", + }, + ], + name: "validateUserOp", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "address payable", + name: "withdrawAddress", + type: "address", + }, + { + internalType: "uint256", + name: "amount", + type: "uint256", + }, + ], + name: "withdrawDepositTo", + outputs: [], + stateMutability: "payable", + type: "function", + }, +] as const; diff --git a/packages/account/src/index.ts b/packages/account/src/index.ts index d43249476..615c0a6da 100644 --- a/packages/account/src/index.ts +++ b/packages/account/src/index.ts @@ -1,9 +1,43 @@ -export * from "./interfaces/ISmartAccount"; -export * from "./interfaces/IBaseSmartAccount"; -export * from "./interfaces/IBiconomySmartAccount"; -export * from "./utils/Types"; -export * from "./SmartAccount"; -export * from "./BiconomySmartAccount"; -export * from "./utils/Constants"; -export * from "./BiconomySmartAccountV2"; -export * from "./utils/VoidSigner"; +import { BiconomySmartAccountV2 } from "./BiconomySmartAccountV2.js"; +import { type BiconomySmartAccountV2Config } from "./utils/Types.js"; + +export * from "./utils/Types.js"; +export * from "./utils/Constants.js"; +export * from "./BiconomySmartAccountV2.js"; + +export { WalletClientSigner, LocalAccountSigner, type SmartAccountSigner } from "@alchemy/aa-core"; +export { + BiconomyPaymaster as Paymaster, + type IPaymaster, + PaymasterMode, + type IHybridPaymaster, + type PaymasterFeeQuote, + type SponsorUserOperationDto, + type FeeQuotesOrDataResponse, + createPaymaster, +} from "@biconomy/paymaster"; +export { EthersSigner, convertSigner, type LightSigner } from "@biconomy/common"; +export { + Bundler, + type IBundler, + extractChainIdFromBundlerUrl, + type UserOpResponse, + type UserOpStatus, + type UserOpReceipt, + createBundler, +} from "@biconomy/bundler"; +export { + createECDSAOwnershipValidationModule, + createERC20SessionValidationModule, + createBatchedSessionRouterModule, + createSessionKeyManagerModule, + createMultiChainValidationModule, + DEFAULT_ECDSA_OWNERSHIP_MODULE, + DEFAULT_SESSION_KEY_MANAGER_MODULE, + DEFAULT_MULTICHAIN_MODULE, + DEFAULT_BATCHED_SESSION_ROUTER_MODULE, +} from "@biconomy/modules"; + +export const createSmartAccountClient = BiconomySmartAccountV2.create; + +export type SmartWalletConfig = BiconomySmartAccountV2Config; diff --git a/packages/account/src/interfaces/IBaseSmartAccount.ts b/packages/account/src/interfaces/IBaseSmartAccount.ts deleted file mode 100644 index 64cc5fc92..000000000 --- a/packages/account/src/interfaces/IBaseSmartAccount.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { UserOperation } from "@biconomy/core-types"; -import { BigNumberish, Bytes, BytesLike, BigNumber } from "ethers"; -/** - * Interface for Smart Contract Wallet aka Smart Account. - * This SA does not have to implement ERC4337 interfaces - */ -export interface INon4337Account { - estimateCreationGas(_initCode: string): Promise; - getNonce(): Promise; - signMessage(_message: Bytes | string): Promise; - getAccountAddress(_accountIndex?: number): Promise; -} - -export interface IBaseSmartAccount extends INon4337Account { - getVerificationGasLimit(_initCode: BytesLike): Promise; - getPreVerificationGas(_userOp: Partial): Promise; - signUserOp(_userOp: UserOperation): Promise; - signUserOpHash(_userOpHash: string): Promise; - getUserOpHash(_userOp: Partial): Promise; - getAccountInitCode(): Promise; - getDummySignature(): Promise; -} diff --git a/packages/account/src/interfaces/IBiconomySmartAccount.ts b/packages/account/src/interfaces/IBiconomySmartAccount.ts deleted file mode 100644 index 2534ae461..000000000 --- a/packages/account/src/interfaces/IBiconomySmartAccount.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { UserOperation, Transaction } from "@biconomy/core-types"; -import { - SupportedChainsResponse, - BalancesResponse, - BalancesDto, - UsdBalanceResponse, - SmartAccountByOwnerDto, - SmartAccountsResponse, - SCWTransactionResponse, -} from "@biconomy/node-client"; -import { Overrides, InitilizationData } from "../utils/Types"; -import { BigNumberish, BytesLike } from "ethers"; -import { ISmartAccount } from "./ISmartAccount"; -import { Signer } from "ethers"; - -export interface IBiconomySmartAccount extends ISmartAccount { - init(_initilizationData?: InitilizationData): Promise; - initializeAccountAtIndex(_accountIndex: number): void; - getExecuteCallData(_to: string, _value: BigNumberish, _data: BytesLike): string; - getExecuteBatchCallData(_to: Array, _value: Array, _data: Array): string; - buildUserOp(_transactions: Transaction[], _overrides?: Overrides): Promise>; - getAllTokenBalances(_balancesDto: BalancesDto): Promise; - getTotalBalanceInUsd(_balancesDto: BalancesDto): Promise; - getSmartAccountsByOwner(_smartAccountByOwnerDto: SmartAccountByOwnerDto): Promise; - getTransactionsByAddress(_chainId: number, _address: string): Promise; - getTransactionByHash(_txHash: string): Promise; - getAllSupportedChains(): Promise; - attachSigner(_signer: Signer): Promise; -} diff --git a/packages/account/src/interfaces/ISmartAccount.ts b/packages/account/src/interfaces/ISmartAccount.ts deleted file mode 100644 index fce4a8f8c..000000000 --- a/packages/account/src/interfaces/ISmartAccount.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { UserOperation } from "@biconomy/core-types"; -import { UserOpResponse } from "@biconomy/bundler"; -export interface ISmartAccount { - getSmartAccountAddress(_accountIndex: number): Promise; - signUserOp(_userOp: UserOperation): Promise; - sendUserOp(_userOp: UserOperation): Promise; - sendSignedUserOp(_userOp: UserOperation): Promise; -} diff --git a/packages/account/src/utils/Constants.ts b/packages/account/src/utils/Constants.ts index 40a5c053e..d6f52fc7a 100644 --- a/packages/account/src/utils/Constants.ts +++ b/packages/account/src/utils/Constants.ts @@ -1,4 +1,3 @@ -import { ChainId } from "@biconomy/core-types"; import { EntryPointAddresses, BiconomyFactories, @@ -8,6 +7,8 @@ import { BiconomyImplementationsByVersion, } from "./Types"; +export const ADDRESS_ZERO = "0x0000000000000000000000000000000000000000"; + // will always be latest entrypoint address export const DEFAULT_ENTRYPOINT_ADDRESS = "0x5ff137d4b0fdcd49dca30c7cf57e578a026d2789"; export const ENTRYPOINT_ADDRESSES: EntryPointAddresses = { @@ -43,7 +44,7 @@ export const BICONOMY_IMPLEMENTATION_ADDRESSES_BY_VERSION: BiconomyImplementatio Object.entries(BICONOMY_IMPLEMENTATION_ADDRESSES).map(([k, v]) => [v, k]), ); -export const EIP1559_UNSUPPORTED_NETWORKS: Array = [97, 56, 1442, 1101]; +export const EIP1559_UNSUPPORTED_NETWORKS: Array = [97, 56, 1442, 1101]; export const PROXY_CREATION_CODE = "0x6080346100aa57601f61012038819003918201601f19168301916001600160401b038311848410176100af578084926020946040528339810103126100aa57516001600160a01b0381168082036100aa5715610065573055604051605a90816100c68239f35b60405162461bcd60e51b815260206004820152601e60248201527f496e76616c696420696d706c656d656e746174696f6e206164647265737300006044820152606490fd5b600080fd5b634e487b7160e01b600052604160045260246000fdfe608060405230546000808092368280378136915af43d82803e156020573d90f35b3d90fdfea2646970667358221220a03b18dce0be0b4c9afe58a9eb85c35205e2cf087da098bbf1d23945bf89496064736f6c63430008110033"; @@ -55,3 +56,9 @@ export const DefaultGasLimit = { verificationGasLimit: 1000000, preVerificationGas: 100000, }; + +export const ERROR_MESSAGES = { + SPENDER_REQUIRED: "spender is required for ERC20 mode", + NO_FEE_QUOTE: "FeeQuote was not provided, please call smartAccount.getTokenFees() to get feeQuote", + FAILED_FEE_QUOTE_FETCH: "Failed to fetch fee quote", +}; diff --git a/packages/account/src/utils/Preverificaiton.ts b/packages/account/src/utils/Preverificaiton.ts deleted file mode 100644 index 5b32b0054..000000000 --- a/packages/account/src/utils/Preverificaiton.ts +++ /dev/null @@ -1,118 +0,0 @@ -import { UserOperation } from "@biconomy/core-types"; -import { NotPromise, packUserOp } from "@biconomy/common"; // '@account-abstraction/utils' -import { arrayify, hexlify } from "ethers/lib/utils"; -import { BigNumber } from "ethers"; -export interface GasOverheads { - /** - * fixed overhead for entire handleOp bundle. - */ - fixed: number; - - /** - * per userOp overhead, added on top of the above fixed per-bundle. - */ - perUserOp: number; - - /** - * overhead for userOp word (32 bytes) block - */ - perUserOpWord: number; - - // perCallDataWord: number - - /** - * zero byte cost, for calldata gas cost calculations - */ - zeroByte: number; - - /** - * non-zero byte cost, for calldata gas cost calculations - */ - nonZeroByte: number; - - /** - * expected bundle size, to split per-bundle overhead between all ops. - */ - bundleSize: number; - - /** - * expected length of the userOp signature. - */ - sigSize: number; -} - -export interface VerificationGasLimits { - /** - * per userOp gasLimit for validateUserOp() - * called from entrypoint to the account - * should consider max execution - */ - validateUserOpGas: number; - - /** - * per userOp gasLimit for validatePaymasterUserOp() - * called from entrypoint to the paymaster - * should consider max execution - */ - validatePaymasterUserOpGas: number; - - /** - * per userOp gasLimit for postOp() - * called from entrypoint to the paymaster - * should consider max execution for paymaster/s this account may use - */ - postOpGas: number; -} - -export const DefaultGasOverheads: GasOverheads = { - fixed: 21000, - perUserOp: 18300, - perUserOpWord: 4, - zeroByte: 4, - nonZeroByte: 16, - bundleSize: 1, - sigSize: 65, -}; - -export const DefaultGasLimits: VerificationGasLimits = { - validateUserOpGas: 100000, - validatePaymasterUserOpGas: 100000, - postOpGas: 10877, -}; - -/** - * calculate the preVerificationGas of the given UserOperation - * preVerificationGas (by definition) is the cost overhead that can't be calculated on-chain. - * it is based on parameters that are defined by the Ethereum protocol for external transactions. - * @param userOp filled userOp to calculate. The only possible missing fields can be the signature and preVerificationGas itself - * @param overheads gas overheads to use, to override the default values - */ -export function calcPreVerificationGas(userOp: Partial>, overheads?: Partial): BigNumber { - const ov = { ...DefaultGasOverheads, ...(overheads ?? {}) }; - /* eslint-disable @typescript-eslint/no-explicit-any */ - const p: NotPromise = { - // dummy values, in case the UserOp is incomplete. - paymasterAndData: "0x", - preVerificationGas: BigNumber.from(21000), // dummy value, just for calldata cost - signature: hexlify(Buffer.alloc(ov.sigSize, 1)), // dummy signature - ...userOp, - } as any; - - const packed = arrayify(packUserOp(p, false)); - const lengthInWord = (packed.length + 31) / 32; - /** - * general explanation - * 21000 base gas - * ~ 18300 gas per userOp : corresponds to _validateAccountAndPaymasterValidationData() method, - * Some lines in _handlePostOp() after actualGasCost calculation and compensate() method called in handleOps() method - * plus any gas overhead that can't be tracked on-chain - * (if bundler needs to charge the premium one way is to increase this value for ops to sign) - */ - const callDataCost = packed.map((x) => (x === 0 ? ov.zeroByte : ov.nonZeroByte)).reduce((sum, x) => sum + x); - const ret = Math.round(callDataCost + ov.fixed / ov.bundleSize + ov.perUserOp + ov.perUserOpWord * lengthInWord); - if (ret) { - return BigNumber.from(ret); - } else { - throw new Error("can't calculate preVerificationGas"); - } -} diff --git a/packages/account/src/utils/Types.ts b/packages/account/src/utils/Types.ts index 942166b5b..0967d0f8f 100644 --- a/packages/account/src/utils/Types.ts +++ b/packages/account/src/utils/Types.ts @@ -1,151 +1,179 @@ -import { Signer } from "ethers"; -import { BigNumberish, BigNumber } from "ethers"; +import { BigNumberish, SmartAccountSigner, UserOperationStruct } from "@alchemy/aa-core"; import { IBundler } from "@biconomy/bundler"; -import { IPaymaster, PaymasterFeeQuote, SponsorUserOperationDto } from "@biconomy/paymaster"; +import { + type FeeQuotesOrDataDto, + type IPaymaster, + type PaymasterFeeQuote, + PaymasterMode, + type SmartAccountData, + type SponsorUserOperationDto, +} from "@biconomy/paymaster"; import { BaseValidationModule, ModuleInfo } from "@biconomy/modules"; -import { Provider } from "@ethersproject/providers"; -import { GasOverheads } from "./Preverificaiton"; -import { UserOperation, ChainId } from "@biconomy/core-types"; -import { WalletClientSigner } from "@alchemy/aa-core"; +import { Hex, WalletClient } from "viem"; +import { SupportedSigner } from "@biconomy/common"; -export type EntryPointAddresses = { - [address: string]: string; -}; - -export type BiconomyFactories = { - [address: string]: string; -}; - -export type BiconomyImplementations = { - [address: string]: string; -}; - -export type EntryPointAddressesByVersion = { - [version: string]: string; -}; - -export type BiconomyFactoriesByVersion = { - [version: string]: string; -}; - -export type BiconomyImplementationsByVersion = { - [version: string]: string; -}; +export type EntryPointAddresses = Record; +export type BiconomyFactories = Record; +export type BiconomyImplementations = Record; +export type EntryPointAddressesByVersion = Record; +export type BiconomyFactoriesByVersion = Record; +export type BiconomyImplementationsByVersion = Record; export type SmartAccountConfig = { + /** entryPointAddress: address of the smart account factory */ entryPointAddress: string; + /** factoryAddress: address of the smart account factory */ bundler?: IBundler; }; -/** - * Enum representing available validation modules. - * - * - `ECDSA_OWNERSHIP`: Default module for ECDSA ownership validation. - * - `MULTICHAIN`: Default module for multi-chain validation. - * - If you don't provide any module, ECDSA_OWNERSHIP will be used as default - */ -/*export enum AuthorizationModuleType { - ECDSA_OWNERSHIP = DEFAULT_ECDSA_OWNERSHIP_MODULE, - // MULTICHAIN = DEFAULT_MULTICHAIN_MODULE, -}*/ - -export type BaseSmartAccountConfig = ConditionalBundlerProps & { - // owner?: Signer // can be in child classes +export interface GasOverheads { + /** fixed: fixed gas overhead */ + fixed: number; + /** perUserOp: per user operation gas overhead */ + perUserOp: number; + /** perUserOpWord: per user operation word gas overhead */ + perUserOpWord: number; + /** zeroByte: per byte gas overhead */ + zeroByte: number; + /** nonZeroByte: per non zero byte gas overhead */ + nonZeroByte: number; + /** bundleSize: per signature bundleSize */ + bundleSize: number; + /** sigSize: sigSize gas overhead */ + sigSize: number; +} + +export type BaseSmartAccountConfig = { + /** index: helps to not conflict with other smart account instances */ index?: number; - provider?: Provider; + /** provider: WalletClientSigner from viem */ + provider?: WalletClient; + /** entryPointAddress: address of the smart account entry point */ entryPointAddress?: string; + /** accountAddress: address of the smart account, potentially counterfactual */ accountAddress?: string; + /** overheads: {@link GasOverheads} */ overheads?: Partial; - paymaster?: IPaymaster; // PaymasterAPI - chainId: ChainId; + /** paymaster: {@link IPaymaster} interface */ + paymaster?: IPaymaster; + /** chainId: chainId of the network */ + chainId?: number; }; export type BiconomyTokenPaymasterRequest = { + /** feeQuote: {@link PaymasterFeeQuote} */ feeQuote: PaymasterFeeQuote; - spender: string; + /** spender: The address of the spender who is paying for the transaction, this can usually be set to feeQuotesResponse.tokenPaymasterAddress */ + spender: Hex; + /** maxApproval: If set to true, the paymaster will approve the maximum amount of tokens required for the transaction. Not recommended */ maxApproval?: boolean; }; -export type BiconomySmartAccountConfig = { - signer: Signer; - rpcUrl?: string; - chainId: ChainId; - entryPointAddress?: string; - bundler?: IBundler; - paymaster?: IPaymaster; - nodeClientUrl?: string; -}; - -type RequireAtLeastOne = Pick> & +export type RequireAtLeastOne = Pick> & { [K in Keys]-?: Required> & Partial>>; }[Keys]; -type ConditionalValidationProps = RequireAtLeastOne< - { - defaultValidationModule: BaseValidationModule; - signer: Signer | WalletClientSigner; - }, - "defaultValidationModule" | "signer" ->; - -type ConditionalBundlerProps = RequireAtLeastOne< +export type ConditionalBundlerProps = RequireAtLeastOne< { bundler: IBundler; bundlerUrl: string; }, "bundler" | "bundlerUrl" >; +export type ResolvedBundlerProps = { + bundler: IBundler; +}; +export type ConditionalValidationProps = RequireAtLeastOne< + { + defaultValidationModule: BaseValidationModule; + signer: SupportedSigner; + }, + "defaultValidationModule" | "signer" +>; -export type BiconomySmartAccountV2Config = BaseSmartAccountConfig & - ConditionalValidationProps & { - factoryAddress?: string; - senderAddress?: string; - implementationAddress?: string; - defaultFallbackHandler?: string; - biconomyPaymasterApiKey?: string; - rpcUrl?: string; - nodeClientUrl?: string; - activeValidationModule?: BaseValidationModule; - scanForUpgradedAccountsFromV1?: boolean; - maxIndexForScan?: number; - }; +export type ResolvedValidationProps = { + /** defaultValidationModule: {@link BaseValidationModule} */ + defaultValidationModule: BaseValidationModule; + /** activeValidationModule: {@link BaseValidationModule}. The active validation module. Will default to the defaultValidationModule */ + activeValidationModule: BaseValidationModule; + /** signer: ethers Wallet, viemWallet or alchemys SmartAccountSigner */ + signer: SmartAccountSigner; + /** chainId: chainId of the network */ + chainId: number; +}; + +export type BiconomySmartAccountV2ConfigBaseProps = { + /** Factory address of biconomy factory contract or some other contract you have deployed on chain */ + factoryAddress?: Hex; + /** Sender address: If you want to override the Signer address with some other address and get counterfactual address can use this to pass the EOA and get SA address */ + senderAddress?: Hex; + /** implementation of smart contract address or some other contract you have deployed and want to override */ + implementationAddress?: Hex; + /** defaultFallbackHandler: override the default fallback contract address */ + defaultFallbackHandler?: Hex; + /** rpcUrl: Explicitly set the rpc else it is pulled out of the signer. */ + rpcUrl?: string; // as good as Provider + /** biconomyPaymasterApiKey: The API key retrieved from the Biconomy dashboard */ + biconomyPaymasterApiKey?: string; + /** activeValidationModule: The active validation module. Will default to the defaultValidationModule */ + activeValidationModule?: BaseValidationModule; + /** scanForUpgradedAccountsFromV1: set to true if you you want the userwho was using biconomy SA v1 to upgrade to biconomy SA v2 */ + scanForUpgradedAccountsFromV1?: boolean; + /** the index of SA the EOA have generated and till which indexes the upgraded SA should scan */ + maxIndexForScan?: number; +}; +export type BiconomySmartAccountV2Config = BiconomySmartAccountV2ConfigBaseProps & + BaseSmartAccountConfig & + ConditionalBundlerProps & + ConditionalValidationProps; + +export type BiconomySmartAccountV2ConfigConstructorProps = BiconomySmartAccountV2ConfigBaseProps & + BaseSmartAccountConfig & + ResolvedBundlerProps & + ResolvedValidationProps; export type BuildUserOpOptions = { - overrides?: Overrides; - skipBundlerGasEstimation?: boolean; + /** overrides: Explicitly set gas values */ + // overrides?: Overrides; + /** Not currently in use */ + // skipBundlerGasEstimation?: boolean; + /** params relevant to the module, mostly relevant to sessions */ params?: ModuleInfo; + /** nonceOptions: For overriding the nonce */ nonceOptions?: NonceOptions; + /** forceEncodeForBatch: For encoding the user operation for batch */ forceEncodeForBatch?: boolean; - paymasterServiceData?: SponsorUserOperationDto; + /** paymasterServiceData: Options specific to transactions that involve a paymaster */ + paymasterServiceData?: PaymasterUserOperationDto; + /** simulationType: Determine which parts of the tx a bundler will simulate: "validation" | "validation_and_execution". */ + simulationType?: SimulationType; }; export type NonceOptions = { + /** nonceKey: The key to use for nonce */ nonceKey?: number; + /** nonceOverride: The nonce to use for the transaction */ nonceOverride?: number; }; -// Used in AccountV1 -export type SendUserOpDto = { - signer?: Signer; - simulationType?: SimulationType; -}; - -// Generic options in AccountV2 -export type SendUserOpOptions = { - simulationType?: SimulationType; -}; - export type SimulationType = "validation" | "validation_and_execution"; export type Overrides = { - callGasLimit?: BigNumberish; - verificationGasLimit?: BigNumberish; - preVerificationGas?: BigNumberish; - maxFeePerGas?: BigNumberish; - maxPriorityFeePerGas?: BigNumberish; - paymasterData?: string; - signature?: string; + /* Value used by inner account execution */ + callGasLimit?: Hex; + /* Actual gas used by the validation of this UserOperation */ + verificationGasLimit?: Hex; + /* Gas overhead of this UserOperation */ + preVerificationGas?: Hex; + /* Maximum fee per gas (similar to EIP-1559 max_fee_per_gas) */ + maxFeePerGas?: Hex; + /* Maximum priority fee per gas (similar to EIP-1559 max_priority_fee_per_gas) */ + maxPriorityFeePerGas?: Hex; + /* Address of paymaster sponsoring the transaction, followed by extra data to send to the paymaster ("0x" for self-sponsored transaction) */ + paymasterData?: Hex; + /* Data passed into the account along with the nonce during the verification step */ + signature?: Hex; }; export type InitilizationData = { @@ -153,47 +181,97 @@ export type InitilizationData = { signerAddress?: string; }; +export type PaymasterUserOperationDto = SponsorUserOperationDto & + FeeQuotesOrDataDto & { + /** mode: sponsored or erc20 */ + mode: PaymasterMode; + /** Always recommended, especially when using token paymaster */ + calculateGasLimits?: boolean; + /** Expiry duration in seconds */ + expiryDuration?: number; + /** Webhooks to be fired after user op is sent */ + webhookData?: Record; + /** Smart account meta data */ + smartAccountInfo?: SmartAccountData; + /** the fee-paying token address */ + feeTokenAddress?: string; + /** The fee quote */ + feeQuote?: PaymasterFeeQuote; + /** The address of the spender. This is usually set to FeeQuotesOrDataResponse.tokenPaymasterAddress */ + spender?: Hex; + /** Not recommended */ + maxApproval?: boolean; + }; + export type InitializeV2Data = { accountIndex?: number; }; export type EstimateUserOpGasParams = { - userOp: Partial; - overrides?: Overrides; - skipBundlerGasEstimation?: boolean; + userOp: Partial; + // overrides?: Overrides; + /** Currrently has no effect */ + // skipBundlerGasEstimation?: boolean; + /** paymasterServiceData: Options specific to transactions that involve a paymaster */ paymasterServiceData?: SponsorUserOperationDto; }; export interface TransactionDetailsForUserOp { + /** target: The address of the contract to call */ target: string; + /** data: The data to send to the contract */ data: string; + /** value: The value to send to the contract */ value?: BigNumberish; + /** gasLimit: The gas limit to use for the transaction */ gasLimit?: BigNumberish; + /** maxFeePerGas: The maximum fee per gas to use for the transaction */ maxFeePerGas?: BigNumberish; + /** maxPriorityFeePerGas: The maximum priority fee per gas to use for the transaction */ maxPriorityFeePerGas?: BigNumberish; + /** nonce: The nonce to use for the transaction */ nonce?: BigNumberish; } export type CounterFactualAddressParam = { index?: number; validationModule?: BaseValidationModule; + /** scanForUpgradedAccountsFromV1: set to true if you you want the userwho was using biconomy SA v1 to upgrade to biconomy SA v2 */ scanForUpgradedAccountsFromV1?: boolean; + /** the index of SA the EOA have generated and till which indexes the upgraded SA should scan */ maxIndexForScan?: number; }; export type QueryParamsForAddressResolver = { - eoaAddress: string; + eoaAddress: Hex; index: number; - moduleAddress: string; - moduleSetupData: string; + moduleAddress: Hex; + moduleSetupData: Hex; maxIndexForScan?: number; }; export type SmartAccountInfo = { - accountAddress: string; - factoryAddress: string; + /** accountAddress: The address of the smart account */ + accountAddress: Hex; + /** factoryAddress: The address of the smart account factory */ + factoryAddress: Hex; + /** currentImplementation: The address of the current implementation */ currentImplementation: string; + /** currentVersion: The version of the smart account */ currentVersion: string; + /** factoryVersion: The version of the factory */ factoryVersion: string; - deploymentIndex: BigNumber; + /** deploymentIndex: The index of the deployment */ + deploymentIndex: BigNumberish; }; + +export type ValueOrData = RequireAtLeastOne< + { + value: BigNumberish | string; + data: string; + }, + "value" | "data" +>; +export type Transaction = { + to: string; +} & ValueOrData; diff --git a/packages/account/src/utils/Utils.ts b/packages/account/src/utils/Utils.ts new file mode 100644 index 000000000..d905506c9 --- /dev/null +++ b/packages/account/src/utils/Utils.ts @@ -0,0 +1,45 @@ +import { encodeAbiParameters, parseAbiParameters, keccak256, Hex } from "viem"; +import type { UserOperationStruct } from "@alchemy/aa-core"; + +/** + * pack the userOperation + * @param op + * @param forSignature "true" if the hash is needed to calculate the getUserOpHash() + * "false" to pack entire UserOp, for calculating the calldata cost of putting it on-chain. + */ +export function packUserOp(op: Partial, forSignature = true): string { + if (!op.initCode || !op.callData || !op.paymasterAndData) throw new Error("Missing userOp properties"); + if (forSignature) { + return encodeAbiParameters(parseAbiParameters("address, uint256, bytes32, bytes32, uint256, uint256, uint256, uint256, uint256, bytes32"), [ + op.sender as Hex, + BigInt(op.nonce as Hex), + keccak256(op.initCode as Hex), + keccak256(op.callData as Hex), + BigInt(op.callGasLimit as Hex), + BigInt(op.verificationGasLimit as Hex), + BigInt(op.preVerificationGas as Hex), + BigInt(op.maxFeePerGas as Hex), + BigInt(op.maxPriorityFeePerGas as Hex), + keccak256(op.paymasterAndData as Hex), + ]); + } else { + // for the purpose of calculating gas cost encode also signature (and no keccak of bytes) + return encodeAbiParameters(parseAbiParameters("address, uint256, bytes, bytes, uint256, uint256, uint256, uint256, uint256, bytes, bytes"), [ + op.sender as Hex, + BigInt(op.nonce as Hex), + op.initCode as Hex, + op.callData as Hex, + BigInt(op.callGasLimit as Hex), + BigInt(op.verificationGasLimit as Hex), + BigInt(op.preVerificationGas as Hex), + BigInt(op.maxFeePerGas as Hex), + BigInt(op.maxPriorityFeePerGas as Hex), + op.paymasterAndData as Hex, + op.signature as Hex, + ]); + } +} + +export const isNullOrUndefined = (value: any): value is undefined => { + return value === null || value === undefined; +}; diff --git a/packages/account/src/utils/VoidSigner.ts b/packages/account/src/utils/VoidSigner.ts deleted file mode 100644 index d028c56ad..000000000 --- a/packages/account/src/utils/VoidSigner.ts +++ /dev/null @@ -1,57 +0,0 @@ -import { Provider, TransactionRequest } from "@ethersproject/providers"; -import { BigNumberish, BytesLike, Bytes, Signer } from "ethers"; -import { LogLevel, Logger } from "@ethersproject/logger"; -const logger = new Logger("signer"); - -export interface TypedDataDomain { - name?: string; - version?: string; - chainId?: BigNumberish; - verifyingContract?: string; - salt?: BytesLike; -} - -export interface TypedDataField { - name: string; - type: string; -} - -export type Deferrable = { - [K in keyof T]: T[K] | Promise; -}; - -export class VoidSigner extends Signer { - readonly address: string; - - readonly provider?: Provider; - - constructor(_address: string, _provider?: Provider) { - super(); - this.address = _address; - this.provider = _provider; - } - - getAddress(): Promise { - return Promise.resolve(this.address); - } - - _fail(message: string, operation: string): Promise { - return Promise.resolve().then(() => { - logger.throwError(message, Logger.errors.UNSUPPORTED_OPERATION, { operation: operation }); - }); - } - - signMessage(message: Bytes | string): Promise { - logger._log(LogLevel.INFO, [message]); - return this._fail("VoidSigner cannot sign messages", "signMessage"); - } - - signTransaction(transaction: Deferrable): Promise { - logger._log(LogLevel.INFO, [transaction]); - return this._fail("VoidSigner cannot sign transactions", "signTransaction"); - } - - connect(provider: Provider): VoidSigner { - return new VoidSigner(this.address, provider); - } -} diff --git a/packages/account/src/utils/index.ts b/packages/account/src/utils/index.ts new file mode 100644 index 000000000..8d298755a --- /dev/null +++ b/packages/account/src/utils/index.ts @@ -0,0 +1,3 @@ +export * from "./Types"; +export * from "./Utils"; +export * from "./Constants"; diff --git a/packages/account/tests/SmartAccountV1.testnet.spec.ts b/packages/account/tests/SmartAccountV1.testnet.spec.ts deleted file mode 100644 index f6ef197af..000000000 --- a/packages/account/tests/SmartAccountV1.testnet.spec.ts +++ /dev/null @@ -1,72 +0,0 @@ -import { Wallet, ethers } from "ethers"; -import { SampleRecipient, SampleRecipient__factory } from "@account-abstraction/utils/dist/src/types"; -import { BiconomySmartAccount } from "../src/BiconomySmartAccount"; -import { ChainId, UserOperation } from "@biconomy/core-types"; -import { calcPreVerificationGas } from "../src/utils/Preverificaiton"; - -describe("calcPreVerificationGas", () => { - const userOp = { - sender: "0x".padEnd(42, "1"), - nonce: 0, - initCode: "0x3333", - callData: "0x4444", - callGasLimit: 5, - verificationGasLimit: 6, - maxFeePerGas: 8, - maxPriorityFeePerGas: 9, - paymasterAndData: "0xaaaaaa", - }; - it("returns a gas value proportional to sigSize", async () => { - const pvg1 = calcPreVerificationGas(userOp, { sigSize: 0 }); - const pvg2 = calcPreVerificationGas(userOp, { sigSize: 65 }); - expect(pvg2.toNumber()).toBeGreaterThan(pvg1.toNumber()); - }); -}); - -describe("BiconomySmartAccount API Specs", () => { - let owner: Wallet; - let target: string; - let accountAPI: BiconomySmartAccount; - let beneficiary: string; - let recipient: SampleRecipient; - let accountAddress: string; - - beforeAll(async () => { - owner = Wallet.createRandom(); - - target = await Wallet.createRandom().getAddress(); - - // recipient = await new SampleRecipient__factory(owner).deploy(); - accountAPI = new BiconomySmartAccount({ - chainId: ChainId.POLYGON_MUMBAI, - signer: owner, - // paymaster: paymaster, - // bundler: bundler, - }); - - // console.log('account api provider ', accountAPI.provider) - - accountAPI = await accountAPI.init(); - console.log("Account EOA owner ", accountAPI.owner); - - const counterFactualAddress = await accountAPI.getSmartAccountAddress(0); - console.log("Counterfactual address ", counterFactualAddress); - }, 20000); - - // on Mumbai testnet some tests should be performed to make sure nothing breaks in AccountV1 - - /*it("Nonce should be zero", async () => { - const builtUserOp = await accountAPI.buildUserOp([{ to: target, value: ethers.utils.parseEther("1".toString()), data: "0x" }]); - console.log("builtUserOp", builtUserOp); - expect(builtUserOp?.nonce?.toString()).toBe("0"); - }); - it("Sender should be non zero", async () => { - const builtUserOp = await accountAPI.buildUserOp([{ to: target, value: ethers.utils.parseEther("1".toString()), data: "0x" }]); - expect(builtUserOp.sender).not.toBe(ethers.constants.AddressZero); - }); - it("InitCode length should be greater then 170", async () => { - const builtUserOp = await accountAPI.buildUserOp([{ to: target, value: ethers.utils.parseEther("1".toString()), data: "0x" }]); - expect(builtUserOp?.initCode?.length).toBeGreaterThan(170); - });*/ - it("estimateUserOperationGas for native token transfer using local estimation logic", async () => {}); -}); diff --git a/packages/account/tests/SmartAccountV2-Abstract-Paymaster.local.spec.ts b/packages/account/tests/SmartAccountV2-Abstract-Paymaster.local.spec.ts deleted file mode 100644 index f4c847b00..000000000 --- a/packages/account/tests/SmartAccountV2-Abstract-Paymaster.local.spec.ts +++ /dev/null @@ -1,106 +0,0 @@ -import { EntryPoint, EntryPoint__factory } from "@account-abstraction/contracts"; -import { Wallet, ethers } from "ethers"; - -import { - SmartAccount_v200, - SmartAccountFactory_v200, - SmartAccount_v200__factory, - SmartAccountFactory_v200__factory, - ECDSAOwnershipRegistryModule_v100__factory, -} from "@biconomy/common"; - -import { BiconomySmartAccountV2 } from "../src/BiconomySmartAccountV2"; -import { ChainId } from "@biconomy/core-types"; -import { ECDSAOwnershipValidationModule } from "@biconomy/modules"; -import { BaseValidationModule } from "@biconomy/modules"; -import { ECDSAOwnershipRegistryModule_v100 } from "@biconomy/common"; -import { BiconomyPaymaster } from "@biconomy/paymaster"; - -const provider = new ethers.providers.JsonRpcProvider("http://127.0.0.1:8545"); -const signer = provider.getSigner(); - -describe("BiconomySmartAccountV2 Paymaster Abstraction", () => { - let owner: Wallet; - let factoryOwner: Wallet; - let account: BiconomySmartAccountV2; - let entryPoint: EntryPoint; - let accountFactory: SmartAccountFactory_v200; - let ecdsaModule: ECDSAOwnershipRegistryModule_v100; - - let module1: BaseValidationModule; - - beforeAll(async () => { - owner = Wallet.createRandom(); - entryPoint = await new EntryPoint__factory(signer).deploy(); - console.log("ep address ", entryPoint.address); - factoryOwner = Wallet.createRandom(); - - const accountImpl: SmartAccount_v200 = await new SmartAccount_v200__factory(signer).deploy(entryPoint.address); - - accountFactory = await new SmartAccountFactory_v200__factory(signer).deploy(accountImpl.address, await factoryOwner.getAddress()); - - ecdsaModule = await new ECDSAOwnershipRegistryModule_v100__factory(signer).deploy(); - - module1 = await ECDSAOwnershipValidationModule.create({ - signer: owner, - moduleAddress: ecdsaModule.address, - }); - - console.log("provider url ", provider.connection.url); - - await new Promise((resolve) => setTimeout(resolve, 10000)); - }, 30000); - - it("Create a smart account with paymaster through api key", async () => { - - account = await BiconomySmartAccountV2.create({ - chainId: ChainId.GANACHE, - rpcUrl: "http://127.0.0.1:8545", - entryPointAddress: entryPoint.address, - biconomyPaymasterApiKey: "7K_k68BFN.ed274da8-69a1-496d-a897-508fc2213216", - factoryAddress: accountFactory.address, - defaultFallbackHandler: await accountFactory.minimalHandler(), - defaultValidationModule: module1, - activeValidationModule: module1, - bundlerUrl: "https://bundler.biconomy.io/api/v2/1337/..." - }); - - const address = await account.getAccountAddress(); - console.log("account address ", address); - - const paymaster = account.paymaster; - - expect(paymaster).not.toBeNull() - expect(paymaster).not.toBeUndefined() - - expect(address).toBe(account.accountAddress); - }, 10000); - - it("Create a smart account with paymaster by creating instance", async () => { - - const paymaster = new BiconomyPaymaster({ - paymasterUrl: "https://paymaster.biconomy.io/api/v1/80001/7K_k68BFN.ed274da8-69a1-496d-a897-508fc2213216", - }) - - account = await BiconomySmartAccountV2.create({ - chainId: ChainId.GANACHE, - rpcUrl: "http://127.0.0.1:8545", - entryPointAddress: entryPoint.address, - factoryAddress: accountFactory.address, - defaultFallbackHandler: await accountFactory.minimalHandler(), - defaultValidationModule: module1, - activeValidationModule: module1, - paymaster: paymaster, - bundlerUrl: "https://bundler.biconomy.io/api/v2/1337/..." - }); - - const address = await account.getAccountAddress(); - console.log("account address ", address); - - expect(account.paymaster).not.toBeNull() - expect(account.paymaster).not.toBeUndefined() - - expect(address).toBe(account.accountAddress); - }, 10000); - -}); \ No newline at end of file diff --git a/packages/account/tests/SmartAccountV2-Module-Abstraction.local.spec.ts b/packages/account/tests/SmartAccountV2-Module-Abstraction.local.spec.ts deleted file mode 100644 index 53d468752..000000000 --- a/packages/account/tests/SmartAccountV2-Module-Abstraction.local.spec.ts +++ /dev/null @@ -1,87 +0,0 @@ -import { EntryPoint, EntryPoint__factory } from "@account-abstraction/contracts"; -import { Wallet, ethers } from "ethers"; -import { SampleRecipient, SampleRecipient__factory } from "@account-abstraction/utils/dist/src/types"; - -import { - SmartAccount_v200, - SmartAccountFactory_v200, - SmartAccount_v200__factory, - SmartAccountFactory_v200__factory, - ECDSAOwnershipRegistryModule_v100__factory, -} from "@biconomy/common"; - -import { BiconomySmartAccountV2 } from "../src/BiconomySmartAccountV2"; -import { ChainId } from "@biconomy/core-types"; -import { ECDSAOwnershipRegistryModule_v100 } from "@biconomy/common"; -import { ECDSAOwnershipValidationModule } from "@biconomy/modules"; - -const provider = new ethers.providers.JsonRpcProvider("http://127.0.0.1:8545"); -const signer = provider.getSigner(); - -describe("BiconomySmartAccountV2 Module Abstraction", () => { - let owner: Wallet; - let factoryOwner: Wallet; - let entryPoint: EntryPoint; - let beneficiary: string; - let recipient: SampleRecipient; - let accountFactory: SmartAccountFactory_v200; - let ecdsaModule: ECDSAOwnershipRegistryModule_v100; - - beforeAll(async () => { - owner = Wallet.createRandom(); - entryPoint = await new EntryPoint__factory(signer).deploy(); - console.log("ep address ", entryPoint.address); - beneficiary = await signer.getAddress(); - factoryOwner = Wallet.createRandom(); - - const accountImpl: SmartAccount_v200 = await new SmartAccount_v200__factory(signer).deploy(entryPoint.address); - - accountFactory = await new SmartAccountFactory_v200__factory(signer).deploy(accountImpl.address, await factoryOwner.getAddress()); - - ecdsaModule = await new ECDSAOwnershipRegistryModule_v100__factory(signer).deploy(); - - recipient = await new SampleRecipient__factory(signer).deploy(); - - await new Promise((resolve) => setTimeout(resolve, 10000)); - }, 30000); - - it("Create smart account with default module (ECDSA)", async () => { - const account: BiconomySmartAccountV2 = await BiconomySmartAccountV2.create({ - chainId: ChainId.GANACHE, - rpcUrl: "http://127.0.0.1:8545", - entryPointAddress: entryPoint.address, - signer, - bundlerUrl: "https://bundler.biconomy.io/api/v2/1337/..." - /*defaultValidationModule: await ECDSAOwnershipValidationModule.create({ - signer: signer, - moduleAddress: ecdsaModule.address, - }),*/ - }); - - const address = await account.getAccountAddress(); - console.log("Module Abstraction Test - Account address ", address); - - expect(address).toBe(account.accountAddress); - - const module = account.activeValidationModule; - console.log(`ACTIVE MODULE - ${module.getAddress()}`); - }, 10000); - - it("Create smart account with ECDSA module", async () => { - const account: BiconomySmartAccountV2 = await BiconomySmartAccountV2.create({ - chainId: ChainId.GANACHE, - rpcUrl: "http://127.0.0.1:8545", - entryPointAddress: entryPoint.address, - signer, - bundlerUrl: "https://bundler.biconomy.io/api/v2/1337/..." - }); - - const address = await account.getAccountAddress(); - console.log("Module Abstraction Test - Account address ", address); - - expect(address).toBe(account.accountAddress); - - const module = account.activeValidationModule; - console.log(`ACTIVE MODULE - ${module.getAddress()}`); - }, 10000); -}); diff --git a/packages/account/tests/SmartAccountV2.local.spec.ts b/packages/account/tests/SmartAccountV2.local.spec.ts deleted file mode 100644 index da8aea562..000000000 --- a/packages/account/tests/SmartAccountV2.local.spec.ts +++ /dev/null @@ -1,609 +0,0 @@ -import { EntryPoint, EntryPoint__factory } from "@account-abstraction/contracts"; -import { VoidSigner, Wallet, ethers } from "ethers"; -import { SampleRecipient, SampleRecipient__factory } from "@account-abstraction/utils/dist/src/types"; - -import { - SmartAccount_v200, - SmartAccountFactory_v200, - SmartAccount_v200__factory, - SmartAccountFactory_v200__factory, - ECDSAOwnershipRegistryModule_v100__factory, - MultiChainValidationModule_v100__factory, -} from "@biconomy/common"; - -import { BiconomySmartAccountV2 } from "../src/BiconomySmartAccountV2"; -import { ChainId, UserOperation } from "@biconomy/core-types"; -import { DEFAULT_ECDSA_OWNERSHIP_MODULE, ECDSAOwnershipValidationModule } from "@biconomy/modules"; -import { MultiChainValidationModule } from "@biconomy/modules"; -import { BaseValidationModule } from "@biconomy/modules"; -import { ECDSAOwnershipRegistryModule_v100 } from "@biconomy/common"; -import { MultiChainValidationModule_v100 } from "@biconomy/common"; -import { createWalletClient, http } from "viem"; -import { localhost, polygonMumbai } from "viem/chains"; -import { WalletClientSigner } from "@alchemy/aa-core"; -import { privateKeyToAccount } from "viem/accounts"; -import { DEFAULT_ENTRYPOINT_ADDRESS } from "../src/utils/Constants"; - -const provider = new ethers.providers.JsonRpcProvider("http://127.0.0.1:8545"); -const signer = provider.getSigner(); -const SENTINEL_MODULE = "0x0000000000000000000000000000000000000001"; - -const MUMBAI = "https://rpc-mumbai.maticvigil.com"; -const randomEOA = ethers.Wallet.createRandom(); -const testPrivKey = randomEOA.privateKey.slice(2); - -describe("BiconomySmartAccountV2 API Specs", () => { - let owner: Wallet; - let factoryOwner: Wallet; - let accountAPI: BiconomySmartAccountV2; - let entryPoint: EntryPoint; - let beneficiary: string; - let recipient: SampleRecipient; - let accountFactory: SmartAccountFactory_v200; - let ecdsaModule: ECDSAOwnershipRegistryModule_v100; - let multiChainModule: MultiChainValidationModule_v100; - let accountAddress: string; - - let module1: BaseValidationModule; - let module2: BaseValidationModule; - - beforeAll(async () => { - owner = Wallet.createRandom(); - entryPoint = await new EntryPoint__factory(signer).deploy(); - console.log("ep address ", entryPoint.address); - beneficiary = await signer.getAddress(); - factoryOwner = Wallet.createRandom(); - - const accountImpl: SmartAccount_v200 = await new SmartAccount_v200__factory(signer).deploy(entryPoint.address); - - accountFactory = await new SmartAccountFactory_v200__factory(signer).deploy(accountImpl.address, await factoryOwner.getAddress()); - - ecdsaModule = await new ECDSAOwnershipRegistryModule_v100__factory(signer).deploy(); - - module1 = await ECDSAOwnershipValidationModule.create({ - signer: owner, - moduleAddress: ecdsaModule.address, - }); - - multiChainModule = await new MultiChainValidationModule_v100__factory(signer).deploy(); - - module2 = await MultiChainValidationModule.create({ - signer: owner, - moduleAddress: multiChainModule.address, - }); - - console.log("provider url ", provider.connection.url); - - recipient = await new SampleRecipient__factory(signer).deploy(); - accountAPI = await BiconomySmartAccountV2.create({ - chainId: ChainId.GANACHE, - rpcUrl: "http://127.0.0.1:8545", - // paymaster: paymaster, - // bundler: bundler, - entryPointAddress: entryPoint.address, - factoryAddress: accountFactory.address, - implementationAddress: accountImpl.address, - defaultFallbackHandler: await accountFactory.minimalHandler(), - defaultValidationModule: module1, - activeValidationModule: module1, - signer, - bundlerUrl: "https://bundler.biconomy.io/api/v2/1337/..." - }); - - // console.log('account api provider ', accountAPI.provider) - - const counterFactualAddress = await accountAPI.getAccountAddress(); - console.log("Counterfactual address ", counterFactualAddress); - - await new Promise((resolve) => setTimeout(resolve, 10000)); - }, 30000); - - it("Nonce should be zero", async () => { - const builtUserOp = await accountAPI.buildUserOp([{ to: recipient.address, value: ethers.utils.parseEther("1".toString()), data: "0x" }]); - console.log("builtUserOp", builtUserOp); - expect(builtUserOp?.nonce?.toString()).toBe("0"); - }, 30000); - it("Sender should be non zero", async () => { - const builtUserOp = await accountAPI.buildUserOp([{ to: recipient.address, value: ethers.utils.parseEther("1".toString()), data: "0x" }]); - expect(builtUserOp.sender).not.toBe(ethers.constants.AddressZero); - }, 30000); - it("InitCode length should be greater then 170", async () => { - const builtUserOp = await accountAPI.buildUserOp([{ to: recipient.address, value: ethers.utils.parseEther("1".toString()), data: "0x" }]); - expect(builtUserOp?.initCode?.length).toBeGreaterThan(170); - }); - it("#getUserOpHash should match entryPoint.getUserOpHash", async function () { - const userOp: UserOperation = { - sender: "0x".padEnd(42, "1"), - nonce: 2, - initCode: "0x3333", - callData: "0x4444", - callGasLimit: 5, - verificationGasLimit: 6, - preVerificationGas: 7, - maxFeePerGas: 8, - maxPriorityFeePerGas: 9, - paymasterAndData: "0xaaaaaa", - signature: "0xbbbb", - }; - const hash = await accountAPI.getUserOpHash(userOp); - const epHash = await entryPoint.getUserOpHash(userOp); - expect(hash).toBe(epHash); - }); - it("should deploy to counterfactual address", async () => { - accountAddress = await accountAPI.getAccountAddress(); - expect(await provider.getCode(accountAddress).then((code) => code.length)).toBe(2); - - await signer.sendTransaction({ - to: accountAddress, - value: ethers.utils.parseEther("0.1"), - }); - const op = await accountAPI.buildUserOp([ - { - to: recipient.address, - data: recipient.interface.encodeFunctionData("something", ["hello"]), - }, - ]); - - const signedUserOp = await accountAPI.signUserOp(op); - - await entryPoint.handleOps([signedUserOp], beneficiary); - - // ((await expect(entryPoint.handleOps([signedUserOp], beneficiary))) as any).to.emit(recipient, "Sender"); - - expect(await provider.getCode(accountAddress).then((code) => code.length)).toBeGreaterThan(0); - }, 10000); // on github runner it takes more time than 5000ms - - // TODO - // possibly use local bundler API from image - it("should build and send userop via bundler API", async () => {}); - - it("should deploy another account using different validation module", async () => { - let accountAPI2 = await BiconomySmartAccountV2.create({ - chainId: ChainId.GANACHE, - rpcUrl: "http://127.0.0.1:8545", - // paymaster: paymaster, - // bundler: bundler, - entryPointAddress: entryPoint.address, - factoryAddress: accountFactory.address, - implementationAddress: accountAPI.getImplementationAddress(), - defaultFallbackHandler: await accountFactory.minimalHandler(), - defaultValidationModule: module2, - activeValidationModule: module2, - signer, - bundlerUrl: "https://bundler.biconomy.io/api/v2/1337/..." - }); - - // TODO - // Review: Just setting different default validation module and querying account address is not working - // accountAPI.setDefaultValidationModule(module2); - - accountAPI2 = await accountAPI2.init(); - - const accountAddress2 = await accountAPI2.getAccountAddress(); - expect(await provider.getCode(accountAddress2).then((code) => code.length)).toBe(2); - - await signer.sendTransaction({ - to: accountAddress2, - value: ethers.utils.parseEther("0.1"), - }); - const op = await accountAPI2.buildUserOp([ - { - to: recipient.address, - data: recipient.interface.encodeFunctionData("something", ["hello"]), - }, - ]); - - const signedUserOp = await accountAPI2.signUserOp(op); - - await entryPoint.handleOps([signedUserOp], beneficiary); - - // ((await expect(entryPoint.handleOps([signedUserOp], beneficiary))) as any).to.emit(recipient, "Sender"); - - expect(await provider.getCode(accountAddress2).then((code) => code.length)).toBeGreaterThan(0); - }); - - it("should check if module is enabled", async () => { - const isEcdsaModuleEnabled = await accountAPI.isModuleEnabled((module1 as any).moduleAddress); - - expect(isEcdsaModuleEnabled).toBe(true); - - const isMultichainEcdsaModuleEnabled = await accountAPI.isModuleEnabled((module2 as any).moduleAddress); - - expect(isMultichainEcdsaModuleEnabled).toBe(false); - }); - - it("should list all enabled modules", async () => { - const paginatedModules = await accountAPI.getAllModules(); - console.log("enabled modules ", paginatedModules); - }); - - it("should enable a new module", async () => { - let isMultichainEcdsaModuleEnabled = await accountAPI.isModuleEnabled((module2 as any).moduleAddress); - expect(isMultichainEcdsaModuleEnabled).toBe(false); - - // Review: this actually skips whole paymaster stuff and also sends to connected bundler - // const userOpResponse = await accountAPI.enableModule((module2 as any).moduleAddress); - - const enableModuleData = await accountAPI.getEnableModuleData((module2 as any).moduleAddress); - - await signer.sendTransaction({ - to: accountAddress, - value: ethers.utils.parseEther("0.1"), - }); - - const op = await accountAPI.buildUserOp([enableModuleData], { - // skipBundlerGasEstimation: true, - // overrides: { verificationGasLimit: 120000, callGasLimit: 100000, preVerificationGas: 60000 }, - }); - - const signedUserOp = await accountAPI.signUserOp(op); - - await entryPoint.handleOps([signedUserOp], beneficiary); - - // ((await expect(entryPoint.handleOps([signedUserOp], beneficiary))) as any).to.emit(recipient, "Sender"); - - isMultichainEcdsaModuleEnabled = await accountAPI.isModuleEnabled((module2 as any).moduleAddress); - - expect(isMultichainEcdsaModuleEnabled).toBe(true); - }); - - it("signs the userOp using active validation module", async () => { - const op = await accountAPI.buildUserOp([ - { - to: recipient.address, - data: recipient.interface.encodeFunctionData("something", ["hello"]), - }, - ]); - - const signedUserOp = await accountAPI.signUserOp(op); - - expect(signedUserOp.signature).toBeDefined(); - - const userOpHash = await accountAPI.getUserOpHash(op); - - const signature = await accountAPI.signUserOpHash(userOpHash); - - console.log("signature ", signature); - - expect(signature).toBeDefined(); - }); - - it("disables requested module", async () => { - let isMultichainEcdsaModuleEnabled = await accountAPI.isModuleEnabled((module2 as any).moduleAddress); - expect(isMultichainEcdsaModuleEnabled).toBe(true); - - const disableModuleData = await accountAPI.getDisableModuleData(SENTINEL_MODULE, (module2 as any).moduleAddress); - - await signer.sendTransaction({ - to: accountAddress, - value: ethers.utils.parseEther("0.1"), - }); - - const op = await accountAPI.buildUserOp([disableModuleData], { - // skipBundlerGasEstimation: true, - // overrides: { verificationGasLimit: 120000, callGasLimit: 100000, preVerificationGas: 60000 }, - }); - - const signedUserOp = await accountAPI.signUserOp(op); - - await entryPoint.handleOps([signedUserOp], beneficiary); - - // ((await expect(entryPoint.handleOps([signedUserOp], beneficiary))) as any).to.emit(recipient, "Sender"); - - isMultichainEcdsaModuleEnabled = await accountAPI.isModuleEnabled((module2 as any).moduleAddress); - expect(isMultichainEcdsaModuleEnabled).toBe(false); - - const modulesAfter = await accountAPI.getAllModules(); - expect(modulesAfter[0]).toBe((module1 as any).moduleAddress); - }); - - it("sends userop using multichain (different) validation module after enabling and setting it up", async () => { - let isMultichainEcdsaModuleEnabled = await accountAPI.isModuleEnabled((module2 as any).moduleAddress); - expect(isMultichainEcdsaModuleEnabled).toBe(false); - - // Review: this actually skips whole paymaster stuff and also sends to connected bundler - // const userOpResponse = await accountAPI.enableModule((module2 as any).moduleAddress); - - const accountOwnerAddress = await owner.getAddress(); - - const multichainEcdsaOwnershipSetupData = multiChainModule.interface.encodeFunctionData("initForSmartAccount", [accountOwnerAddress]); - - const setupAndEnableModuleData = await accountAPI.getSetupAndEnableModuleData((module2 as any).moduleAddress, multichainEcdsaOwnershipSetupData); - - await signer.sendTransaction({ - to: accountAddress, - value: ethers.utils.parseEther("0.1"), - }); - - const op1 = await accountAPI.buildUserOp([setupAndEnableModuleData], { - // skipBundlerGasEstimation: true, - // overrides: { verificationGasLimit: 120000, callGasLimit: 100000, preVerificationGas: 60000 }, - }); - - console.log("op1 ", op1); - - const signedUserOp1 = await accountAPI.signUserOp(op1); - - await entryPoint.handleOps([signedUserOp1], beneficiary); - - isMultichainEcdsaModuleEnabled = await accountAPI.isModuleEnabled((module2 as any).moduleAddress); - expect(isMultichainEcdsaModuleEnabled).toBe(true); - - // Setting it as active validation module now - accountAPI = accountAPI.setActiveValidationModule(module2); - - const op = await accountAPI.buildUserOp([ - { - to: recipient.address, - data: recipient.interface.encodeFunctionData("something", ["hello"]), - }, - ]); - - const signedUserOp = await accountAPI.signUserOp(op); - - await entryPoint.handleOps([signedUserOp], beneficiary); - - // ((await expect(entryPoint.handleOps([signedUserOp], beneficiary))) as any).to.emit(recipient, "Sender"); - }, 10000); // on github runner it takes more time than 5000ms - - it("Creates another replicated instance using void signer", async () => { - const newmodule = await ECDSAOwnershipValidationModule.create({ - signer: new VoidSigner(await owner.getAddress()), - moduleAddress: ecdsaModule.address, - }); - - const accountAPI2 = await BiconomySmartAccountV2.create({ - chainId: ChainId.GANACHE, - rpcUrl: "http://127.0.0.1:8545", - // paymaster: paymaster, - // bundler: bundler, - entryPointAddress: entryPoint.address, - factoryAddress: accountFactory.address, - implementationAddress: accountAPI.getImplementationAddress(), - defaultFallbackHandler: await accountFactory.minimalHandler(), - defaultValidationModule: newmodule, - activeValidationModule: newmodule, - signer, - bundlerUrl: "https://bundler.biconomy.io/api/v2/1337/..." - }); - - const address = await accountAPI2.getAccountAddress(); - console.log("account address ", address); - - expect(address).toBe(accountAPI.accountAddress); - }, 10000); - - it("Create and setup ECDSA module with WalletClientSigner", async () => { - const wallet = privateKeyToAccount(`0x${testPrivKey}`); - - const walletClient = createWalletClient({ - account: wallet, - chain: polygonMumbai, - transport: http(MUMBAI), - }); - - const ecdsaSigner = new WalletClientSigner(walletClient, "json-rpc"); - - const account = await BiconomySmartAccountV2.create({ - chainId: ChainId.POLYGON_MUMBAI, - entryPointAddress: DEFAULT_ENTRYPOINT_ADDRESS, - signer: ecdsaSigner, - bundlerUrl: "https://bundler.biconomy.io/api/v2/1337/..." - }); - - const counterFactualAddress = await account.getAccountAddress(); - console.log("Counterfactual address ", counterFactualAddress); - - const module = await ECDSAOwnershipValidationModule.create({ - signer: owner, - moduleAddress: DEFAULT_ECDSA_OWNERSHIP_MODULE, - }); - - account.setActiveValidationModule(module); - }); - - it("Create and setup ECDSA module with ethersV5 Signer", async () => { - const module = await ECDSAOwnershipValidationModule.create({ - signer: randomEOA, - moduleAddress: DEFAULT_ECDSA_OWNERSHIP_MODULE, - }); - - const account = await BiconomySmartAccountV2.create({ - chainId: ChainId.POLYGON_MUMBAI, - entryPointAddress: DEFAULT_ENTRYPOINT_ADDRESS, - signer: owner, - defaultValidationModule: module, - activeValidationModule: module, - bundlerUrl: "https://bundler.biconomy.io/api/v2/1337/..." - }); - - const counterFactualAddress = await account.getAccountAddress(); - console.log("Counterfactual address ", counterFactualAddress); - - expect(counterFactualAddress).toBeDefined(); - - expect(module.getAddress()).toBe(DEFAULT_ECDSA_OWNERSHIP_MODULE); - }); - - // NOTE - // For tests we could only use sendUserOp for test networks until bundler integration test suite is integrated - // For test networks we can send transactions for Account created using random private key, IF paymaster is used - // buildUserOp tests we can do for any test network cause that only requires bundles without sending transactions - // If we can send prefund to the account then specific private key can be added (only testnet native tokens) or loaded from env - // TODO - - // it("Send user op with ethersV5 signer", async () => { - - // const provider = new ethers.providers.JsonRpcProvider(MUMBAI); - // const owner: Signer = new ethers.Wallet(testPrivKey, provider); - - // const bundler: IBundler = new Bundler({ - // bundlerUrl: "", - // chainId: ChainId.POLYGON_MUMBAI, - // entryPointAddress: DEFAULT_ENTRYPOINT_ADDRESS, - // }) - - // const module = await ECDSAOwnershipValidationModule.create({ - // signer: owner, - // moduleAddress: DEFAULT_ECDSA_OWNERSHIP_MODULE - // }) - - // const newAccount = await BiconomySmartAccountV2.create({ - // chainId: ChainId.POLYGON_MUMBAI, - // entryPointAddress: DEFAULT_ENTRYPOINT_ADDRESS, - // signer: owner, - // bundler, - // defaultValidationModule: module, - // activeValidationModule: module - // }); - - // const accountAddress = await newAccount.getAccountAddress(); - - // const prefund = { - // to: accountAddress, - // value: ethers.utils.parseEther("0.1"), - // } - - // const prefundResp = await owner.sendTransaction(prefund); - // prefundResp.wait(); - - // const tx = { - // to: await Wallet.createRandom().getAddress(), - // data: "0x" - // } - - // const userOp = await newAccount.buildUserOp([tx]); - // const res = await newAccount.sendUserOp(userOp); - // const txhash = await res.waitForTxHash(); - - // console.log("txhash ", txhash); - - // expect(txhash).toBeDefined(); - - // }); - - // it("Send user op with WalletClientSigner signer", async () => { - - // const wallet = privateKeyToAccount(`0x${testPrivKey}`) - - // const walletClient = createWalletClient({ - // account: wallet, - // transport: http("https://rpc-mumbai.maticvigil.com"), - // }); - - // let owner = new WalletClientSigner( - // walletClient, - // "json-rpc" - // ); - - // const bundler: IBundler = new Bundler({ - // bundlerUrl: "", - // chainId: ChainId.POLYGON_MUMBAI, - // entryPointAddress: DEFAULT_ENTRYPOINT_ADDRESS, - // }) - - // const module = await ECDSAOwnershipValidationModule.create({ - // signer: owner, - // moduleAddress: DEFAULT_ECDSA_OWNERSHIP_MODULE - // }) - - // const newAccount = await BiconomySmartAccountV2.create({ - // chainId: ChainId.POLYGON_MUMBAI, - // entryPointAddress: DEFAULT_ENTRYPOINT_ADDRESS, - // signer: owner, - // bundler, - // defaultValidationModule: module, - // activeValidationModule: module - // }); - - // const accountAddress: `0x${string}` = await newAccount.getAccountAddress() as `0x${string}`; - - // const prefundResp = await walletClient.sendTransaction({ - // account: wallet, - // to: accountAddress, - // value: 100000000000000000n, - // chain: polygonMumbai - // }); - - // const tx = { - // to: await Wallet.createRandom().getAddress(), - // data: "0x" - // } - - // const userOp = await newAccount.buildUserOp([tx]); - // const res = await newAccount.sendUserOp(userOp); - // const txhash = await res.waitForTxHash(); - - // console.log("txhash ", txhash); - - // expect(txhash).toBeDefined(); - // }); - - it("Create smart account with default module (ECDSA) without creating instance or providing module name", async () => { - const account: BiconomySmartAccountV2 = await BiconomySmartAccountV2.create({ - chainId: ChainId.GANACHE, - rpcUrl: "http://127.0.0.1:8545", - entryPointAddress: entryPoint.address, - signer, - bundlerUrl: "https://bundler.biconomy.io/api/v2/1337/..." - }); - - const address = await account.getAccountAddress(); - console.log("Module Abstraction Test - Account address ", address); - - expect(address).toBe(account.accountAddress); - - const module = account.activeValidationModule; - console.log(`ACTIVE MODULE - ${module.getAddress()}`); - - expect(module.getAddress()).toBe(DEFAULT_ECDSA_OWNERSHIP_MODULE); - }, 10000); - - it("Create smart account with ECDSA module without creating instance", async () => { - const account: BiconomySmartAccountV2 = await BiconomySmartAccountV2.create({ - chainId: ChainId.GANACHE, - rpcUrl: "http://127.0.0.1:8545", - entryPointAddress: entryPoint.address, - signer, - bundlerUrl: "https://bundler.biconomy.io/api/v2/1337/..." - }); - - const address = await account.getAccountAddress(); - console.log("Module Abstraction Test - Account address ", address); - - expect(address).toBe(account.accountAddress); - - const module = account.activeValidationModule as ECDSAOwnershipValidationModule; - - console.log(`ACTIVE MODULE - ${module.getAddress()}`); - - expect(module.getAddress()).toBe(DEFAULT_ECDSA_OWNERSHIP_MODULE); - }, 10000); - - it("Create smart account with default module using WalletClientSigner as signer", async () => { - const walletClient = createWalletClient({ - chain: localhost, - transport: http("http://127.0.0.1:8545"), - }); - - const ecdsaSigner = new WalletClientSigner(walletClient, "json-rpc"); - - const account: BiconomySmartAccountV2 = await BiconomySmartAccountV2.create({ - chainId: ChainId.GANACHE, - rpcUrl: "http://127.0.0.1:8545", - entryPointAddress: entryPoint.address, - signer: ecdsaSigner, - bundlerUrl: "https://bundler.biconomy.io/api/v2/1337/..." - }); - - const address = await account.getAccountAddress(); - console.log("Module Abstraction Test - Account address ", address); - - expect(address).toBe(account.accountAddress); - - const module = account.activeValidationModule; - console.log(`ACTIVE MODULE - ${module.getAddress()}`); - - expect(module.getAddress()).toBe(DEFAULT_ECDSA_OWNERSHIP_MODULE); - }, 10000); -}); diff --git a/packages/account/tests/account.e2e.spec.ts b/packages/account/tests/account.e2e.spec.ts new file mode 100644 index 000000000..c7594b732 --- /dev/null +++ b/packages/account/tests/account.e2e.spec.ts @@ -0,0 +1,459 @@ +import { TestData } from "../../../tests"; +import { createSmartAccountClient, ERROR_MESSAGES, FeeQuotesOrDataResponse, IHybridPaymaster, PaymasterMode } from "../src/index"; +import { Hex, encodeFunctionData, getContract, parseAbi } from "viem"; +import { UserOperationStruct } from "@alchemy/aa-core"; +import { checkBalance, entryPointABI } from "../../../tests/utils"; +import { ERC20_ABI } from "@biconomy/modules"; + +describe("Account Tests", () => { + let mumbai: TestData; + let baseSepolia: TestData; + + beforeEach(() => { + // @ts-ignore: Comes from setup-e2e-tests + [mumbai, baseSepolia] = testDataPerChain; + }); + + it("should have addresses", async () => { + const { + whale: { viemWallet: signer, publicAddress: sender }, + minnow: { viemWallet: recipientSigner, publicAddress: recipient }, + bundlerUrl, + } = mumbai; + + const { + whale: { viemWallet: signerBase, publicAddress: senderBase }, + minnow: { viemWallet: recipientSignerBase, publicAddress: recipientBase }, + bundlerUrl: bundlerUrlBase, + } = baseSepolia; + + const smartAccount = await createSmartAccountClient({ + signer, + bundlerUrl, + }); + + const reciepientSmartAccount = await createSmartAccountClient({ + signer: recipientSigner, + bundlerUrl, + }); + + const smartAccountBase = await createSmartAccountClient({ + signer: signerBase, + bundlerUrl: bundlerUrlBase, + }); + + const reciepientSmartAccountBase = await createSmartAccountClient({ + signer: recipientSignerBase, + bundlerUrl, + }); + + const addresses = await Promise.all([ + sender, + smartAccount.getAddress(), + recipient, + reciepientSmartAccount.getAddress(), + senderBase, + smartAccountBase.getAddress(), + recipientBase, + reciepientSmartAccountBase.getAddress(), + ]); + expect(addresses.every(Boolean)).toBeTruthy(); + }); + + it("should send some native token to a recipient", async () => { + const { + whale: { viemWallet: signer }, + minnow: { publicAddress: recipient }, + bundlerUrl, + publicClient, + } = mumbai; + + const smartAccount = await createSmartAccountClient({ + signer, + bundlerUrl, + }); + + const balance = (await checkBalance(publicClient, recipient)) as bigint; + const { wait } = await smartAccount.sendTransaction( + { + to: recipient, + value: 1, + data: "0x", + }, + { + simulationType: "validation_and_execution", + }, + ); + + const result = await wait(); + const newBalance = (await checkBalance(publicClient, recipient)) as bigint; + + expect(result?.receipt?.transactionHash).toBeTruthy(); + expect(newBalance - balance).toBe(1n); + }, 50000); + + it("Create a smart account with paymaster with an api key", async () => { + const { + whale: { viemWallet: signer }, + bundlerUrl, + biconomyPaymasterApiKey, + } = mumbai; + + const smartAccount = await createSmartAccountClient({ + signer, + biconomyPaymasterApiKey, + bundlerUrl, + }); + + const paymaster = smartAccount.paymaster; + expect(paymaster).not.toBeNull(); + expect(paymaster).not.toBeUndefined(); + }); + + it("Should gaslessly mint an NFT on Mumbai", async () => { + const nftAddress: Hex = "0x1758f42Af7026fBbB559Dc60EcE0De3ef81f665e"; + const { + whale: { viemWallet: signer, publicAddress: recipient }, + bundlerUrl, + biconomyPaymasterApiKey, + publicClient, + } = mumbai; + + const smartAccount = await createSmartAccountClient({ + signer, + bundlerUrl, + biconomyPaymasterApiKey, + }); + + const encodedCall = encodeFunctionData({ + abi: parseAbi(["function safeMint(address to) public"]), + functionName: "safeMint", + args: [recipient], + }); + + const transaction = { + to: nftAddress, // NFT address + data: encodedCall, + }; + + const balance = (await checkBalance(publicClient, recipient, nftAddress)) as bigint; + + const maticBalanceBefore = await checkBalance(publicClient, await smartAccount.getAddress()); + + const response = await smartAccount.sendTransaction(transaction, { + paymasterServiceData: { mode: PaymasterMode.SPONSORED }, + simulationType: "validation", + }); + + const userOpReceipt = await response.wait(3); + expect(userOpReceipt.userOpHash).toBeTruthy(); + expect(userOpReceipt.success).toBe("true"); + + const maticBalanceAfter = await checkBalance(publicClient, await smartAccount.getAddress()); + + expect(maticBalanceAfter).toEqual(maticBalanceBefore); + + const newBalance = (await checkBalance(publicClient, recipient, nftAddress)) as bigint; + + expect(newBalance - balance).toBe(1n); + }, 60000); + + it("Should mint an NFT on Mumbai and pay with ERC20 - with preferredToken", async () => { + const nftAddress: Hex = "0x1758f42Af7026fBbB559Dc60EcE0De3ef81f665e"; + const { + whale: { viemWallet: signer, publicAddress: recipient }, + bundlerUrl, + publicClient, + biconomyPaymasterApiKey, + } = mumbai; + + const smartAccount = await createSmartAccountClient({ + signer, + bundlerUrl, + biconomyPaymasterApiKey, + }); + + const encodedCall = encodeFunctionData({ + abi: parseAbi(["function safeMint(address _to)"]), + functionName: "safeMint", + args: [recipient], + }); + + const transaction = { + to: nftAddress, // NFT address + data: encodedCall, + }; + + const balance = (await checkBalance(publicClient, recipient, nftAddress)) as bigint; + const maticBalanceBefore = await checkBalance(publicClient, await smartAccount.getAddress()); + const usdcBalanceBefore = await checkBalance(publicClient, await smartAccount.getAddress(), "0xda5289fcaaf71d52a80a254da614a192b693e977"); + + const { wait } = await smartAccount.sendTransaction([transaction], { + paymasterServiceData: { + mode: PaymasterMode.ERC20, + preferredToken: "0xda5289fcaaf71d52a80a254da614a192b693e977", + }, + }); + + const { + receipt: { transactionHash }, + userOpHash, + success, + } = await wait(); + + expect(transactionHash).toBeTruthy(); + expect(userOpHash).toBeTruthy(); + expect(success).toBe("true"); + + const maticBalanceAfter = await checkBalance(publicClient, await smartAccount.getAddress()); + expect(maticBalanceAfter).toEqual(maticBalanceBefore); + + const usdcBalanceAfter = await checkBalance(publicClient, await smartAccount.getAddress(), "0xda5289fcaaf71d52a80a254da614a192b693e977"); + expect(usdcBalanceAfter).toBeLessThan(usdcBalanceBefore); + + const newBalance = (await checkBalance(publicClient, recipient, nftAddress)) as bigint; + expect(newBalance - balance).toBe(1n); + }, 60000); + + it("Should expect several feeQuotes in resonse to empty tokenInfo fields", async () => { + const nftAddress: Hex = "0x1758f42Af7026fBbB559Dc60EcE0De3ef81f665e"; + const { + whale: { viemWallet: signer, publicAddress: recipient }, + bundlerUrl, + biconomyPaymasterApiKey, + } = mumbai; + + const smartAccount = await createSmartAccountClient({ + signer, + bundlerUrl, + biconomyPaymasterApiKey, + }); + + const encodedCall = encodeFunctionData({ + abi: parseAbi(["function safeMint(address _to)"]), + functionName: "safeMint", + args: [recipient], + }); + + const transaction = { + to: nftAddress, // NFT address + data: encodedCall, + }; + + const feeQuotesResponse = await smartAccount.getTokenFees(transaction, { paymasterServiceData: { mode: PaymasterMode.ERC20 } }); + expect(feeQuotesResponse.feeQuotes?.length).toBeGreaterThan(1); + }); + + it("Should mint an NFT on Mumbai and pay with ERC20 - with token selection and no maxApproval", async () => { + const nftAddress: Hex = "0x1758f42Af7026fBbB559Dc60EcE0De3ef81f665e"; + const preferredToken: Hex = "0xda5289fcaaf71d52a80a254da614a192b693e977"; + const { + whale: { viemWallet: signer, publicAddress: recipient }, + bundlerUrl, + biconomyPaymasterApiKey, + publicClient, + } = mumbai; + + const smartAccount = await createSmartAccountClient({ + signer, + bundlerUrl, + biconomyPaymasterApiKey, + }); + + const smartAccountAddress = await smartAccount.getAddress(); + + const encodedCall = encodeFunctionData({ + abi: parseAbi(["function safeMint(address _to)"]), + functionName: "safeMint", + args: [recipient], + }); + + const transaction = { + to: nftAddress, // NFT address + data: encodedCall, + }; + + const feeQuotesResponse = await smartAccount.getTokenFees(transaction, { + paymasterServiceData: { + mode: PaymasterMode.ERC20, + preferredToken, + }, + }); + + const selectedFeeQuote = feeQuotesResponse.feeQuotes?.[0]!; + const spender = feeQuotesResponse.tokenPaymasterAddress!; + + const contract = getContract({ + address: preferredToken, + abi: parseAbi(ERC20_ABI), + client: publicClient, + }); + + const allowanceBefore = (await contract.read.allowance([smartAccountAddress, spender])) as bigint; + + if (allowanceBefore > 0) { + const setAllowanceToZeroTransaction = await (smartAccount?.paymaster as IHybridPaymaster)?.buildTokenApprovalTransaction({ + feeQuote: { ...selectedFeeQuote, maxGasFee: 0 }, + spender, + }); + + const { wait } = await smartAccount.sendTransaction([setAllowanceToZeroTransaction]); + const { success } = await wait(); + + expect(success).toBe("true"); + const allowanceAfter = (await contract.read.allowance([smartAccountAddress, spender])) as bigint; + expect(allowanceAfter).toBe(0n); + } + + const balance = (await checkBalance(publicClient, recipient, nftAddress)) as bigint; + const maticBalanceBefore = await checkBalance(publicClient, smartAccountAddress); + const usdcBalanceBefore = await checkBalance(publicClient, smartAccountAddress, preferredToken); + + const { wait } = await smartAccount.sendTransaction(transaction, { + paymasterServiceData: { + mode: PaymasterMode.ERC20, + feeQuote: selectedFeeQuote, + spender: feeQuotesResponse.tokenPaymasterAddress, + }, + }); + + const { + receipt: { transactionHash }, + userOpHash, + success, + } = await wait(); + + expect(userOpHash).toBeTruthy(); + expect(success).toBe("true"); + expect(transactionHash).toBeTruthy(); + + const maticBalanceAfter = await checkBalance(publicClient, smartAccountAddress); + expect(maticBalanceAfter).toEqual(maticBalanceBefore); + + const usdcBalanceAfter = await checkBalance(publicClient, smartAccountAddress, preferredToken); + expect(usdcBalanceAfter).toBeLessThan(usdcBalanceBefore); + + const newBalance = (await checkBalance(publicClient, recipient, nftAddress)) as bigint; + expect(newBalance - balance).toBe(1n); + }, 60000); + + it("Should throw and error if missing field for ERC20 Paymaster user op", async () => { + const nftAddress: Hex = "0x1758f42Af7026fBbB559Dc60EcE0De3ef81f665e"; + const { + whale: { viemWallet: signer, publicAddress: recipient }, + bundlerUrl, + biconomyPaymasterApiKey, + } = mumbai; + + const smartAccount = await createSmartAccountClient({ + signer, + bundlerUrl, + biconomyPaymasterApiKey, + }); + + const encodedCall = encodeFunctionData({ + abi: parseAbi(["function safeMint(address _to)"]), + functionName: "safeMint", + args: [recipient], + }); + + const transaction = { + to: nftAddress, // NFT address + data: encodedCall, + }; + + const feeQuotesResponse: FeeQuotesOrDataResponse = await smartAccount.getTokenFees(transaction, { + paymasterServiceData: { + mode: PaymasterMode.ERC20, + preferredToken: "0xda5289fcaaf71d52a80a254da614a192b693e977", + }, + }); + + expect(async () => + smartAccount.sendTransaction(transaction, { + paymasterServiceData: { + mode: PaymasterMode.ERC20, + feeQuote: feeQuotesResponse.feeQuotes?.[0], + }, + simulationType: "validation", + }), + ).rejects.toThrow(ERROR_MESSAGES.SPENDER_REQUIRED); + }, 60000); + + it("#getUserOpHash should match entryPoint.getUserOpHash", async () => { + const { + whale: { viemWallet: signer }, + bundlerUrl, + entryPointAddress, + publicClient, + biconomyPaymasterApiKey, + } = mumbai; + + const smartAccount = await createSmartAccountClient({ + signer, + biconomyPaymasterApiKey, + bundlerUrl, + }); + + const userOp: UserOperationStruct = { + sender: "0x".padEnd(42, "1") as string, + nonce: 2, + initCode: "0x3333", + callData: "0x4444", + callGasLimit: 5, + verificationGasLimit: 6, + preVerificationGas: 7, + maxFeePerGas: 8, + maxPriorityFeePerGas: 9, + paymasterAndData: "0xaaaaaa", + signature: "0xbbbb", + }; + + const epHash = await publicClient.readContract({ + address: entryPointAddress as Hex, + abi: entryPointABI, + functionName: "getUserOpHash", + // @ts-ignore + args: [userOp], + }); + + const hash = await smartAccount.getUserOpHash(userOp); + expect(hash).toBe(epHash); + }, 30000); + + it("should be deployed to counterfactual address", async () => { + const { + whale: { viemWallet: signer }, + bundlerUrl, + publicClient, + biconomyPaymasterApiKey, + } = mumbai; + + const smartAccount = await createSmartAccountClient({ + signer, + biconomyPaymasterApiKey, + bundlerUrl, + }); + + const accountAddress = await smartAccount.getAccountAddress(); + const byteCode = await publicClient.getBytecode({ address: accountAddress as Hex }); + + expect(byteCode?.length).toBeGreaterThan(2); + }, 10000); // on github runner it takes more time than 5000ms + + it("should check if ecdsaOwnershipModule is enabled", async () => { + const ecdsaOwnershipModule = "0x0000001c5b32F37F5beA87BDD5374eB2aC54eA8e"; + + const { + whale: { viemWallet: signer }, + bundlerUrl, + } = mumbai; + + const smartAccount = await createSmartAccountClient({ + signer, + bundlerUrl, + }); + + expect(ecdsaOwnershipModule).toBe(smartAccount.activeValidationModule.getAddress()); + }); +}); diff --git a/packages/account/tests/account.spec.ts b/packages/account/tests/account.spec.ts index d86ce1ff7..764fa66f7 100644 --- a/packages/account/tests/account.spec.ts +++ b/packages/account/tests/account.spec.ts @@ -1,5 +1,235 @@ +import { Paymaster, createSmartAccountClient } from "../src"; +import { createWalletClient, http } from "viem"; +import { localhost } from "viem/chains"; +import { privateKeyToAccount, generatePrivateKey } from "viem/accounts"; +import { TestData } from "../../../tests"; +import { JsonRpcProvider } from "@ethersproject/providers"; +import { Wallet } from "@ethersproject/wallet"; + describe("Account Tests", () => { - it("should have a basic test", () => { - expect(true).toBe(true); + let ganache: TestData; + + beforeEach(() => { + // @ts-ignore: Comes from setup-unit-tests + [ganache] = testDataPerChain; + }); + + it("should create a smartAccountClient from an ethers signer", async () => { + const { + bundlerUrl, + minnow: { ethersSigner: signer }, + } = ganache; + + const smartAccount = await createSmartAccountClient({ + signer, + bundlerUrl, + }); + const address = await smartAccount.getAccountAddress(); + expect(address).toBeTruthy(); + }); + + it("should create a smartAccountClient from a walletClient", async () => { + const { + whale: { viemWallet: signer }, + bundlerUrl, + } = ganache; + + const smartAccount = await createSmartAccountClient({ + signer, + bundlerUrl, + }); + const address = await smartAccount.getAccountAddress(); + expect(address).toBeTruthy(); + }); + + it("should pickup the rpcUrl from viem wallet and ethers", async () => { + const { + chainId, + bundlerUrl, + viemChain, + whale: { privateKey, viemWallet: originalViemSigner, ethersSigner: originalEthersSigner }, + } = ganache; + + const newRpcUrl = "http://localhost:8545"; + const defaultRpcUrl = viemChain.rpcUrls.default.http[0]; //http://127.0.0.1:8545" + + const ethersProvider = new JsonRpcProvider(newRpcUrl); + const ethersSignerWithNewRpcUrl = new Wallet(privateKey, ethersProvider); + + const accountOne = privateKeyToAccount(privateKey); + const walletClientWithNewRpcUrl = createWalletClient({ + account: accountOne, + chain: viemChain, + transport: http(newRpcUrl), + }); + + const [smartAccountFromEthersWithNewRpc, smartAccountFromViemWithNewRpc, smartAccountFromEthersWithOldRpc, smartAccountFromViemWithOldRpc] = + await Promise.all([ + createSmartAccountClient({ + chainId, + signer: ethersSignerWithNewRpcUrl, + bundlerUrl, + }), + createSmartAccountClient({ + chainId, + signer: walletClientWithNewRpcUrl, + bundlerUrl, + }), + createSmartAccountClient({ + chainId, + signer: originalEthersSigner, + bundlerUrl, + }), + createSmartAccountClient({ + chainId, + signer: originalViemSigner, + bundlerUrl, + }), + ]); + + const [ + smartAccountFromEthersWithNewRpcAddress, + smartAccountFromViemWithNewRpcAddress, + smartAccountFromEthersWithOldRpcAddress, + smartAccountFromViemWithOldRpcAddress, + ] = await Promise.all([ + smartAccountFromEthersWithNewRpc.getAccountAddress(), + smartAccountFromViemWithNewRpc.getAccountAddress(), + smartAccountFromEthersWithOldRpc.getAccountAddress(), + smartAccountFromViemWithOldRpc.getAccountAddress(), + ]); + + expect( + [ + smartAccountFromEthersWithNewRpcAddress, + smartAccountFromViemWithNewRpcAddress, + smartAccountFromEthersWithOldRpcAddress, + smartAccountFromViemWithOldRpcAddress, + ].every(Boolean), + ).toBeTruthy(); + + expect(smartAccountFromEthersWithNewRpc.rpcProvider.transport.url).toBe(newRpcUrl); + expect(smartAccountFromViemWithNewRpc.rpcProvider.transport.url).toBe(newRpcUrl); + expect(smartAccountFromEthersWithOldRpc.rpcProvider.transport.url).toBe(defaultRpcUrl); + expect(smartAccountFromViemWithOldRpc.rpcProvider.transport.url).toBe(defaultRpcUrl); + }); + + it("should create a smartAccountClient from a signer and chainId", async () => { + const { + chainId, + whale: { alchemyWalletClientSigner: signer }, + bundlerUrl, + } = ganache; + + const smartAccount = await createSmartAccountClient({ + chainId, + signer, + bundlerUrl, + }); + const address = await smartAccount.getAccountAddress(); + expect(address).toBeTruthy(); + }); + + it("should provide an account address", async () => { + const { + bundlerUrl, + whale: { viemWallet: signer }, + } = ganache; + + const smartAccount = await createSmartAccountClient({ + signer, + bundlerUrl, + }); + const address = await smartAccount.getAccountAddress(); + expect(address).toBeTruthy(); + }); + + it("Nonce should be zero", async () => { + const { + entryPointAddress, + bundlerUrl, + whale: { viemWallet: signer }, + minnow: { publicAddress: recipient }, + } = ganache; + + const smartAccount = await createSmartAccountClient({ + entryPointAddress, + signer, + bundlerUrl, + }); + const address = await smartAccount.getAccountAddress(); + expect(address).toBeTruthy(); + + const builtUserOp = await smartAccount.buildUserOp([{ to: recipient, value: 1, data: "0x" }]); + console.log("builtUserOp", builtUserOp); + expect(builtUserOp?.nonce?.toString()).toBe("0x0"); + }); + + it("should have an active validation module", async () => { + const { + bundlerUrl, + whale: { viemWallet: signer }, + } = ganache; + + const smartAccount = await createSmartAccountClient({ + signer, + bundlerUrl, + }); + + const module = smartAccount.activeValidationModule; + expect(module).toBeTruthy(); + }); + + it("Create a smart account with paymaster by creating instance", async () => { + const { + whale: { viemWallet: signer }, + bundlerUrl, + biconomyPaymasterApiKey, + } = ganache; + + const paymasterUrl = "https://paymaster.biconomy.io/api/v1/80001/" + biconomyPaymasterApiKey; + const paymaster = new Paymaster({ paymasterUrl }); + + const smartAccount = await createSmartAccountClient({ + signer, + bundlerUrl, + paymaster, + }); + expect(smartAccount.paymaster).not.toBeNull(); + expect(smartAccount.paymaster).not.toBeUndefined(); + }, 10000); + + it("should fail to create a smartAccountClient from a walletClient without a chainId", async () => { + const { bundlerUrl } = ganache; + + const account = privateKeyToAccount(generatePrivateKey()); + const viemWalletClientNoChainId = createWalletClient({ + account, + transport: http(localhost.rpcUrls.default.http[0]), + }); + + expect( + await expect( + createSmartAccountClient({ + signer: viemWalletClientNoChainId, + bundlerUrl, + }), + ).rejects.toThrow("Cannot consume a viem wallet without a chainId"), + ); + }); + + it("should fail to create a smartAccountClient from a walletClient without an account", async () => { + const { bundlerUrl } = ganache; + + const viemWalletNoAccount = createWalletClient({ + transport: http(localhost.rpcUrls.default.http[0]), + }); + + expect(async () => + createSmartAccountClient({ + signer: viemWalletNoAccount, + bundlerUrl, + }), + ).rejects.toThrow("Cannot consume a viem wallet without an account"); }); }); diff --git a/packages/account/tsconfig.build.json b/packages/account/tsconfig.build.json new file mode 100644 index 000000000..42d88a236 --- /dev/null +++ b/packages/account/tsconfig.build.json @@ -0,0 +1,32 @@ +{ + "$schema": "https://json.schemastore.org/tsconfig", + "display": "Build", + "compilerOptions": { + "lib": ["es2022", "dom"], + "target": "es2021", + "types": ["node"], + "allowJs": false, + "skipLibCheck": true, + "esModuleInterop": true, + "allowSyntheticDefaultImports": true, + "strict": true, + "forceConsistentCasingInFileNames": true, + "module": "esnext", + "moduleResolution": "node", + "resolveJsonModule": true, + "isolatedModules": true, + "verbatimModuleSyntax": false, + "useDefineForClassFields": true, + "noFallthroughCasesInSwitch": true, + "noImplicitReturns": true, + "useUnknownInCatchVariables": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "declaration": true, + "inlineSources": true, + "noEmit": false, + "sourceMap": true + }, + "exclude": ["**/*/node_modules", "**/*/tests", "tests", "tests/**/*"], + "include": ["src"] +} \ No newline at end of file diff --git a/packages/account/tsconfig.json b/packages/account/tsconfig.json index d4bee29bb..53677da37 100644 --- a/packages/account/tsconfig.json +++ b/packages/account/tsconfig.json @@ -5,7 +5,9 @@ "outDir": "dist", "baseUrl": "src", "resolveJsonModule": true, - "esModuleInterop": true + "esModuleInterop": true, + "lib": ["es2020"], + "types": ["node"] }, "include": ["src", "src/**/*.json"], } diff --git a/packages/account/typedoc.json b/packages/account/typedoc.json new file mode 100644 index 000000000..6a717b22a --- /dev/null +++ b/packages/account/typedoc.json @@ -0,0 +1,8 @@ +{ + "$schema": "https://typedoc.org/schema.json", + "entryPoints": ["src/index.ts"], + "basePath": "src", + "includes": "src", + "out": "docs", + "gitRevision": "main" +} diff --git a/packages/bundler/.esbuild.js b/packages/bundler/.esbuild.js new file mode 100644 index 000000000..ca355e346 --- /dev/null +++ b/packages/bundler/.esbuild.js @@ -0,0 +1,58 @@ +const esbuildPluginTsc = require("esbuild-plugin-tsc"); +const esbuild = require("esbuild"); +const { dependencies, peerDependencies = {} } = require("./package.json"); +const { Generator } = require("npm-dts"); + +const COMMON_SETTINGS = { + entryPoints: ["src/index.ts"], + minify: true, + bundle: true, + plugins: [esbuildPluginTsc({ force: true })], +}; + +const ESM_SETTINGS = { + ...COMMON_SETTINGS, + sourcemap: true, + outfile: "dist/esm/index.js", + platform: "browser", + target: "esnext", + format: "esm", + mainFields: ["browser", "module", "main"], +}; +const buildForESM = async () => await esbuild.build(ESM_SETTINGS); + +const CJS_SETTINGS = { + ...COMMON_SETTINGS, + format: "cjs", + sourcemap: false, + outfile: "dist/cjs/index.js", + platform: "node", +}; + +const watchForCJS = async () => { + let ctx = await esbuild.context(CJS_SETTINGS); + await ctx.watch(); + await ctx.serve({ servedir: "dist/src" }); + console.log("watching..."); +}; + +const buildForCJS = async () => await esbuild.build(CJS_SETTINGS); +const buildForTYP = async () => await new Generator({ entry: "src/index.ts", output: "dist/types/index.d.ts" }).generate(); + +(async () => { + const buildType = process.argv.slice(2)[0]; + const shouldWatch = process.argv.slice(3)[0] === "--watch"; + if (!buildType) { + console.log("No build type provided"); + process.exit(1); + } + console.log(`Building for ${buildType}`); + if (buildType === "ESM") { + await buildForESM(); + } else if (buildType === "CJS") { + console.log("watching? " + shouldWatch); + await (shouldWatch ? watchForCJS : buildForCJS)(); + } else if (buildType === "TYP") { + await buildForTYP(); + } +})(); diff --git a/packages/bundler/CHANGELOG.md b/packages/bundler/CHANGELOG.md index 8e768924c..35465063e 100644 --- a/packages/bundler/CHANGELOG.md +++ b/packages/bundler/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## 4.0.0 (2023-07-02) + +Export createBundler alias for static Bundler.create call + ## 3.1.3 (2023-12-28) VERSION Bump Only. @@ -11,29 +15,23 @@ VERSION Bump Only. ### Features -* Make entrypoint address optional in bundler config ([547724a](https://github.com/bcnmy/biconomy-client-sdk/pull/337/commits/547724a15366ee1e63aee80fdee0edc128a84c41)) +- Make entrypoint address optional in bundler config ([547724a](https://github.com/bcnmy/biconomy-client-sdk/pull/337/commits/547724a15366ee1e63aee80fdee0edc128a84c41)) ### Bug Fixes -* use undefined in place of ! + check on limits returned by paymaster and throw ([0376901](https://github.com/bcnmy/biconomy-client-sdk/commit/0376901b7aec8c268a6a3c654d147335974d78f3)) +- use undefined in place of ! + check on limits returned by paymaster and throw ([0376901](https://github.com/bcnmy/biconomy-client-sdk/commit/0376901b7aec8c268a6a3c654d147335974d78f3)) ## 3.1.1 (2023-11-09) - ### Bug Fixes -* resolve comments ([34fd6a3](https://github.com/bcnmy/biconomy-client-sdk/commit/34fd6a308805061d9faf408f1ce6da9cac0ee819)) - +- resolve comments ([34fd6a3](https://github.com/bcnmy/biconomy-client-sdk/commit/34fd6a308805061d9faf408f1ce6da9cac0ee819)) ### Features -* add linea mainnet ([c3d1283](https://github.com/bcnmy/biconomy-client-sdk/commit/c3d12832002c18e187f910b5f7dac5ef5b797abf)) -* chain integration ([ddc5d91](https://github.com/bcnmy/biconomy-client-sdk/commit/ddc5d91d5df10a10266f4500644d24e0bc1ea684)) -* chain integration ([738556e](https://github.com/bcnmy/biconomy-client-sdk/commit/738556efcfda70fedc652befc0b35f8835c5e360)) - - - - +- add linea mainnet ([c3d1283](https://github.com/bcnmy/biconomy-client-sdk/commit/c3d12832002c18e187f910b5f7dac5ef5b797abf)) +- chain integration ([ddc5d91](https://github.com/bcnmy/biconomy-client-sdk/commit/ddc5d91d5df10a10266f4500644d24e0bc1ea684)) +- chain integration ([738556e](https://github.com/bcnmy/biconomy-client-sdk/commit/738556efcfda70fedc652befc0b35f8835c5e360)) ## 3.1.0 (2023-09-20) @@ -41,20 +39,15 @@ Modular Account Abstraction is here. ### Bug Fixes -* lint warning and errors ([2135498](https://github.com/bcnmy/biconomy-client-sdk/commit/2135498896beb54d25add820c1521ffa22d5db7c)) -* linting ([563befe](https://github.com/bcnmy/biconomy-client-sdk/commit/563befedcc37aee4c531e01809b47e559a33f526)) -* more lint issues ([10df908](https://github.com/bcnmy/biconomy-client-sdk/commit/10df90821b473fd668907cf3e447dfe3825317fc)) - +- lint warning and errors ([2135498](https://github.com/bcnmy/biconomy-client-sdk/commit/2135498896beb54d25add820c1521ffa22d5db7c)) +- linting ([563befe](https://github.com/bcnmy/biconomy-client-sdk/commit/563befedcc37aee4c531e01809b47e559a33f526)) +- more lint issues ([10df908](https://github.com/bcnmy/biconomy-client-sdk/commit/10df90821b473fd668907cf3e447dfe3825317fc)) ### Features -* base mainnet integration ([c17f5d6](https://github.com/bcnmy/biconomy-client-sdk/commit/c17f5d6c2fe34b106e6d9755f54fab2493db6fbe)) -* chain integration ([ddc5d91](https://github.com/bcnmy/biconomy-client-sdk/commit/ddc5d91d5df10a10266f4500644d24e0bc1ea684)) -* chain integration ([738556e](https://github.com/bcnmy/biconomy-client-sdk/commit/738556efcfda70fedc652befc0b35f8835c5e360)) - - - - +- base mainnet integration ([c17f5d6](https://github.com/bcnmy/biconomy-client-sdk/commit/c17f5d6c2fe34b106e6d9755f54fab2493db6fbe)) +- chain integration ([ddc5d91](https://github.com/bcnmy/biconomy-client-sdk/commit/ddc5d91d5df10a10266f4500644d24e0bc1ea684)) +- chain integration ([738556e](https://github.com/bcnmy/biconomy-client-sdk/commit/738556efcfda70fedc652befc0b35f8835c5e360)) ## 3.0.0 (2023-08-28) @@ -62,33 +55,20 @@ Modular SDK - consists stable version of below updates done in Alphas. ### Features -* base mainnet integration ([c17f5d6](https://github.com/bcnmy/biconomy-client-sdk/commit/c17f5d6c2fe34b106e6d9755f54fab2493db6fbe)) - - - - +- base mainnet integration ([c17f5d6](https://github.com/bcnmy/biconomy-client-sdk/commit/c17f5d6c2fe34b106e6d9755f54fab2493db6fbe)) ## 3.0.0-alpha.0 (2023-08-02) VERSION Bump Only. - - - # 3.1.0-alpha.0 (2023-07-24) - ### Features -* chain integration ([738556e](https://github.com/bcnmy/biconomy-client-sdk/commit/738556efcfda70fedc652befc0b35f8835c5e360)) - - - - +- chain integration ([738556e](https://github.com/bcnmy/biconomy-client-sdk/commit/738556efcfda70fedc652befc0b35f8835c5e360)) ## 3.0.0-alpha.0 (2023-07-12) - ### Bug Fixes -* linting ([563befe](https://github.com/bcnmy/biconomy-client-sdk/commit/563befedcc37aee4c531e01809b47e559a33f526)) +- linting ([563befe](https://github.com/bcnmy/biconomy-client-sdk/commit/563befedcc37aee4c531e01809b47e559a33f526)) diff --git a/packages/bundler/Readme.md b/packages/bundler/Readme.md index ef4ad69be..06e0c4af6 100644 --- a/packages/bundler/Readme.md +++ b/packages/bundler/Readme.md @@ -28,16 +28,12 @@ yarn add @biconomy/bundler ```typescript // This is how you create bundler instance in your dapp's -import { IBundler, Bundler } from "@biconomy/bundler"; +import { IBundler, createBundler } from "@biconomy/bundler"; // Make use of core-types package import { ChainId } from "@biconomy/core-types"; -const bundler: IBundler = new Bundler({ - bundlerUrl: "", - chainId: ChainId.POLYGON_MAINNET, - entryPointAddress: "", -}); +const bundler: IBundler = await createBundler({ bundlerUrl: "" }); // you can get this value from biconomy dashboard. https://dashboard.biconomy.io ``` Following are the methods that can be call on bundler instance @@ -51,7 +47,7 @@ export interface IBundler { } ``` -**estimateUserOpGas** +**[estimateUserOpGas](https://bcnmy.github.io/biconomy-client-sdk/classes/Bundler.html#estimateUserOpGas)** Estimate the gas values for a UserOperation. Given UserOperation optionally without gas limits and gas prices, return the needed gas limits. The signature field is ignored by the wallet, so that the operation will not require user's approval. Still, it might require putting a "semi-valid" signature (e.g. a signature in the right length) **Return Values** @@ -62,7 +58,7 @@ Estimate the gas values for a UserOperation. Given UserOperation optionally with -------------------------------- -**sendUserOp** +**[sendUserOp](https://bcnmy.github.io/biconomy-client-sdk/classes/Bundler.html#sendUserOp)** it submits a User Operation object to the User Operation pool of the client. The client MUST validate the UserOperation, and return a result accordingly. The result SHOULD be set to the userOpHash if and only if the request passed simulation and was accepted in the client's User Operation pool. If the validation, simulation, or User Operation pool inclusion fails, result SHOULD NOT be returned. Rather, the client SHOULD return the failure reason. @@ -72,7 +68,7 @@ If the UserOperation is valid, the client MUST return the calculated userOpHash -------------------------------- -**getUserOpByHash** +**[getUserOpByHash](https://bcnmy.github.io/biconomy-client-sdk/classes/Bundler.html#getUserOpByHash)** Return a UserOperation based on a hash (userOpHash) returned by sendUserOp (eth_sendUserOperation) **Return Values** @@ -81,7 +77,7 @@ null in case the UserOperation is not yet included in a block, or a full UserOpe -------------------------------- -**getUserOpReceipt** +**[getUserOpReceipt](https://bcnmy.github.io/biconomy-client-sdk/classes/Bundler.html#getUserOpReceipt)** Return a UserOperation receipt based on a hash (userOpHash) returned by eth_sendUserOperation diff --git a/packages/bundler/package.json b/packages/bundler/package.json index 45252d1b8..a55b34c20 100644 --- a/packages/bundler/package.json +++ b/packages/bundler/package.json @@ -1,9 +1,19 @@ { "name": "@biconomy/bundler", - "version": "3.1.3", + "version": "4.0.0", "description": "Biconomy Bundler package to interact with any bundler node as per ERC4337 standard", - "main": "./dist/src/index.js", - "typings": "./dist/src/index.d.ts", + "main": "./dist/cjs/index.js", + "module": "./dist/esm/index.js", + "types": "./dist/types/index.d.ts", + "typings": "./dist/types/index.d.ts", + "exports": { + ".": { + "import": "./dist/esm/index.js", + "types": "./dist/types/index.d.ts", + "default": "./dist/cjs/index.js" + }, + "./package.json": "./package.json" + }, "keywords": [ "Ethereum", "Bundler", @@ -15,7 +25,16 @@ ], "scripts": { "unbuild": "rimraf dist *.tsbuildinfo", - "build": "rimraf dist && tsc", + "build:watch": "yarn build:tsc --watch", + "dist:minify": "esbuild ./dist/esm/**/*.js ./dist/esm/*.js --minify --outdir=./dist/esm --bundle=false --allow-overwrite", + "build": "yarn unbuild && yarn build:tsc", + "build:esbuild": "yarn build:esbuild:cjs && yarn build:esbuild:esm && yarn build:typ", + "build:tsc:cjs": "tsc --project tsconfig.build.json --module commonjs --outDir ./dist/cjs --removeComments --verbatimModuleSyntax false && echo > ./dist/cjs/package.json '{\"type\":\"commonjs\"}'", + "build:tsc:esm": "tsc --project tsconfig.build.json --module esnext --outDir ./dist/esm --removeComments && echo > ./dist/esm/package.json '{\"type\":\"module\"}'", + "build:esbuild:cjs": "node .esbuild.js CJS && echo > ./dist/cjs/package.json '{\"type\":\"commonjs\"}'", + "build:esbuild:esm": "node .esbuild.js ESM && echo > ./dist/esm/package.json '{\"type\":\"module\"}'", + "build:typ": "tsc --project tsconfig.build.json --module esnext --declarationDir ./dist/types --emitDeclarationOnly --declaration --declarationMap", + "build:tsc": "yarn build:tsc:cjs && yarn build:tsc:esm && yarn build:typ && yarn dist:minify", "test:file": "jest --config=../../jest.config.js --runInBand", "test:concurrently": "concurrently -k --success first 'yarn start:ganache > /dev/null'", "test:run": "jest tests/**/*.spec.ts --runInBand", @@ -23,7 +42,7 @@ "format": "prettier --write \"{src,tests}/**/*.ts\"", "lint": "tslint -p tsconfig.json" }, - "author": "talhamalik883 ", + "author": "Biconomy", "repository": { "type": "git", "url": "git+https://github.com/bcnmy/biconomy-client-sdk.git" @@ -37,9 +56,14 @@ "access": "public" }, "dependencies": { - "@biconomy/common": "^3.1.3", - "@biconomy/core-types": "^3.1.3", - "@ethersproject/providers": "^5.7.2", - "ethers": "^5.7.0" + "@alchemy/aa-core": "3.0.0-alpha.4", + "@biconomy/common": "4.0.0", + "viem": "^2.7.3" + }, + "devDependencies": { + "@types/node": "^20.11.10", + "esbuild": "^0.19.11", + "esbuild-plugin-tsc": "^0.4.0", + "npm-dts": "^1.3.12" } } diff --git a/packages/bundler/src/Bundler.ts b/packages/bundler/src/Bundler.ts index 5c78befbe..a20fadfb4 100644 --- a/packages/bundler/src/Bundler.ts +++ b/packages/bundler/src/Bundler.ts @@ -1,5 +1,6 @@ -import { IBundler } from "./interfaces/IBundler"; -import { UserOperation, ChainId } from "@biconomy/core-types"; +import { getChain, type UserOperationStruct } from "@alchemy/aa-core"; +import { createPublicClient, http } from "viem"; +import { IBundler } from "./interfaces/IBundler.js"; import { GetUserOperationReceiptResponse, GetUserOpByHashResponse, @@ -15,18 +16,18 @@ import { UserOpStatus, GetUserOperationStatusResponse, SimulationType, -} from "./utils/Types"; -import { resolveProperties } from "ethers/lib/utils"; -import { deepHexlify, sendRequest, getTimestampInSeconds, HttpMethod, Logger, RPC_PROVIDER_URLS } from "@biconomy/common"; -import { transformUserOP } from "./utils/HelperFunction"; + BundlerConfigWithChainId, +} from "./utils/Types.js"; +import { transformUserOP, getTimestampInSeconds } from "./utils/HelperFunction.js"; import { UserOpReceiptIntervals, UserOpWaitForTxHashIntervals, UserOpWaitForTxHashMaxDurationIntervals, UserOpReceiptMaxDurationIntervals, DEFAULT_ENTRYPOINT_ADDRESS, -} from "./utils/Constants"; -import { JsonRpcProvider } from "@ethersproject/providers"; +} from "./utils/Constants.js"; +import { extractChainIdFromBundlerUrl } from "./utils/Utils.js"; +import { sendRequest, HttpMethod } from "@biconomy/common"; /** * This class implements IBundler interface. @@ -34,16 +35,21 @@ import { JsonRpcProvider } from "@ethersproject/providers"; * Checkout the proposal for more details on Bundlers. */ export class Bundler implements IBundler { + private bundlerConfig: BundlerConfigWithChainId; + // eslint-disable-next-line no-unused-vars - UserOpReceiptIntervals!: { [key in ChainId]?: number }; + UserOpReceiptIntervals!: { [key in number]?: number }; + + UserOpWaitForTxHashIntervals!: { [key in number]?: number }; - UserOpWaitForTxHashIntervals!: { [key in ChainId]?: number }; + UserOpReceiptMaxDurationIntervals!: { [key in number]?: number }; - UserOpReceiptMaxDurationIntervals!: { [key in ChainId]?: number }; + UserOpWaitForTxHashMaxDurationIntervals!: { [key in number]?: number }; - UserOpWaitForTxHashMaxDurationIntervals!: { [key in ChainId]?: number }; + constructor(bundlerConfig: Bundlerconfig) { + const parsedChainId: number = bundlerConfig?.chainId || extractChainIdFromBundlerUrl(bundlerConfig.bundlerUrl); + this.bundlerConfig = { ...bundlerConfig, chainId: parsedChainId }; - constructor(readonly bundlerConfig: Bundlerconfig) { this.UserOpReceiptIntervals = { ...UserOpReceiptIntervals, ...bundlerConfig.userOpReceiptIntervals, @@ -64,41 +70,38 @@ export class Bundler implements IBundler { ...bundlerConfig.userOpWaitForTxHashMaxDurationIntervals, }; - if (!bundlerConfig.entryPointAddress) { - this.bundlerConfig.entryPointAddress = DEFAULT_ENTRYPOINT_ADDRESS; - } else { - this.bundlerConfig.entryPointAddress = bundlerConfig.entryPointAddress; - } + this.bundlerConfig.entryPointAddress = bundlerConfig.entryPointAddress || DEFAULT_ENTRYPOINT_ADDRESS; } - private getBundlerUrl(): string { + public getBundlerUrl(): string { return `${this.bundlerConfig.bundlerUrl}`; } /** - * - * @param chainId + * @param userOpHash * @description This function will fetch gasPrices from bundler * @returns Promise */ - async estimateUserOpGas(userOp: UserOperation): Promise { + async estimateUserOpGas(userOp: UserOperationStruct): Promise { // expected dummySig and possibly dummmy paymasterAndData should be provided by the caller // bundler doesn't know account and paymaster implementation userOp = transformUserOP(userOp); - Logger.log("userOp sending for fee estimate ", userOp); const bundlerUrl = this.getBundlerUrl(); - const response: EstimateUserOpGasResponse = await sendRequest({ - url: bundlerUrl, - method: HttpMethod.Post, - body: { - method: "eth_estimateUserOperationGas", - params: [userOp, this.bundlerConfig.entryPointAddress], - id: getTimestampInSeconds(), - jsonrpc: "2.0", + const response: EstimateUserOpGasResponse = await sendRequest( + { + url: bundlerUrl, + method: HttpMethod.Post, + body: { + method: "eth_estimateUserOperationGas", + params: [userOp, this.bundlerConfig.entryPointAddress], + id: getTimestampInSeconds(), + jsonrpc: "2.0", + }, }, - }); + "Bundler", + ); const userOpGasResponse = response.result; for (const key in userOpGasResponse) { @@ -116,30 +119,35 @@ export class Bundler implements IBundler { * @description This function will send signed userOp to bundler to get mined on chain * @returns Promise */ - async sendUserOp(userOp: UserOperation, simulationType?: SimulationType): Promise { + async sendUserOp(userOp: UserOperationStruct, simulationParam?: SimulationType): Promise { const chainId = this.bundlerConfig.chainId; // transformUserOP will convert all bigNumber values to string userOp = transformUserOP(userOp); - const hexifiedUserOp = deepHexlify(await resolveProperties(userOp)); const simType = { - simulation_type: simulationType || "validation", + simulation_type: simulationParam || "validation", }; - const params = [hexifiedUserOp, this.bundlerConfig.entryPointAddress, simType]; + const params = [userOp, this.bundlerConfig.entryPointAddress, simType]; const bundlerUrl = this.getBundlerUrl(); - const sendUserOperationResponse: SendUserOpResponse = await sendRequest({ - url: bundlerUrl, - method: HttpMethod.Post, - body: { - method: "eth_sendUserOperation", - params: params, - id: getTimestampInSeconds(), - jsonrpc: "2.0", + const sendUserOperationResponse: SendUserOpResponse = await sendRequest( + { + url: bundlerUrl, + method: HttpMethod.Post, + body: { + method: "eth_sendUserOperation", + params: params, + id: getTimestampInSeconds(), + jsonrpc: "2.0", + }, }, - }); + "Bundler", + ); const response: UserOpResponse = { userOpHash: sendUserOperationResponse.result, wait: (confirmations?: number): Promise => { - const provider = new JsonRpcProvider(RPC_PROVIDER_URLS[chainId]); + const providerClient = createPublicClient({ + chain: getChain(chainId), + transport: http(), + }); // Note: maxDuration can be defined per chainId const maxDuration = this.UserOpReceiptMaxDurationIntervals[chainId] || 30000; // default 30 seconds let totalDuration = 0; @@ -151,19 +159,23 @@ export class Bundler implements IBundler { const userOpResponse = await this.getUserOpReceipt(sendUserOperationResponse.result); if (userOpResponse && userOpResponse.receipt && userOpResponse.receipt.blockNumber) { if (confirmations) { - const latestBlock = await provider.getBlockNumber(); - const confirmedBlocks = latestBlock - userOpResponse.receipt.blockNumber; + const latestBlock = await providerClient.getBlockNumber(); + const confirmedBlocks = Number(latestBlock) - userOpResponse.receipt.blockNumber; if (confirmations >= confirmedBlocks) { clearInterval(intervalId); resolve(userOpResponse); + return; } + } else { + clearInterval(intervalId); + resolve(userOpResponse); + return; } - clearInterval(intervalId); - resolve(userOpResponse); } } catch (error) { clearInterval(intervalId); reject(error); + return; } totalDuration += intervalValue; @@ -186,18 +198,19 @@ export class Bundler implements IBundler { return new Promise((resolve, reject) => { const intervalValue = this.UserOpWaitForTxHashIntervals[chainId] || 500; // default 0.5 seconds - const intervalId = setInterval(() => { - this.getUserOpStatus(sendUserOperationResponse.result) - .then((userOpStatus) => { - if (userOpStatus && userOpStatus.state && userOpStatus.transactionHash) { - clearInterval(intervalId); - resolve(userOpStatus); - } - }) - .catch((error) => { + const intervalId = setInterval(async () => { + try { + const userOpStatus = await this.getUserOpStatus(sendUserOperationResponse.result); + if (userOpStatus && userOpStatus.state && userOpStatus.transactionHash) { clearInterval(intervalId); - reject(error); - }); + resolve(userOpStatus); + return; + } + } catch (error) { + clearInterval(intervalId); + reject(error); + return; + } totalDuration += intervalValue; if (totalDuration >= maxDuration) { @@ -225,16 +238,19 @@ export class Bundler implements IBundler { */ async getUserOpReceipt(userOpHash: string): Promise { const bundlerUrl = this.getBundlerUrl(); - const response: GetUserOperationReceiptResponse = await sendRequest({ - url: bundlerUrl, - method: HttpMethod.Post, - body: { - method: "eth_getUserOperationReceipt", - params: [userOpHash], - id: getTimestampInSeconds(), - jsonrpc: "2.0", + const response: GetUserOperationReceiptResponse = await sendRequest( + { + url: bundlerUrl, + method: HttpMethod.Post, + body: { + method: "eth_getUserOperationReceipt", + params: [userOpHash], + id: getTimestampInSeconds(), + jsonrpc: "2.0", + }, }, - }); + "Bundler", + ); const userOpReceipt: UserOpReceipt = response.result; return userOpReceipt; } @@ -247,16 +263,19 @@ export class Bundler implements IBundler { */ async getUserOpStatus(userOpHash: string): Promise { const bundlerUrl = this.getBundlerUrl(); - const response: GetUserOperationStatusResponse = await sendRequest({ - url: bundlerUrl, - method: HttpMethod.Post, - body: { - method: "biconomy_getUserOperationStatus", - params: [userOpHash], - id: getTimestampInSeconds(), - jsonrpc: "2.0", + const response: GetUserOperationStatusResponse = await sendRequest( + { + url: bundlerUrl, + method: HttpMethod.Post, + body: { + method: "biconomy_getUserOperationStatus", + params: [userOpHash], + id: getTimestampInSeconds(), + jsonrpc: "2.0", + }, }, - }); + "Bundler", + ); const userOpStatus: UserOpStatus = response.result; return userOpStatus; } @@ -264,22 +283,24 @@ export class Bundler implements IBundler { /** * * @param userOpHash - * @param chainId * @description this function will return UserOpByHashResponse for given UserOpHash * @returns Promise */ async getUserOpByHash(userOpHash: string): Promise { const bundlerUrl = this.getBundlerUrl(); - const response: GetUserOpByHashResponse = await sendRequest({ - url: bundlerUrl, - method: HttpMethod.Post, - body: { - method: "eth_getUserOperationByHash", - params: [userOpHash], - id: getTimestampInSeconds(), - jsonrpc: "2.0", + const response: GetUserOpByHashResponse = await sendRequest( + { + url: bundlerUrl, + method: HttpMethod.Post, + body: { + method: "eth_getUserOperationByHash", + params: [userOpHash], + id: getTimestampInSeconds(), + jsonrpc: "2.0", + }, }, - }); + "Bundler", + ); const userOpByHashResponse: UserOpByHashResponse = response.result; return userOpByHashResponse; } @@ -289,16 +310,23 @@ export class Bundler implements IBundler { */ async getGasFeeValues(): Promise { const bundlerUrl = this.getBundlerUrl(); - const response: GetGasFeeValuesResponse = await sendRequest({ - url: bundlerUrl, - method: HttpMethod.Post, - body: { - method: "biconomy_getGasFeeValues", - params: [], - id: getTimestampInSeconds(), - jsonrpc: "2.0", + const response: GetGasFeeValuesResponse = await sendRequest( + { + url: bundlerUrl, + method: HttpMethod.Post, + body: { + method: "biconomy_getGasFeeValues", + params: [], + id: getTimestampInSeconds(), + jsonrpc: "2.0", + }, }, - }); + "Bundler", + ); return response.result; } + + public static async create(config: Bundlerconfig): Promise { + return new Bundler(config); + } } diff --git a/packages/bundler/src/index.ts b/packages/bundler/src/index.ts index 2cb31e82e..7a779f5d5 100644 --- a/packages/bundler/src/index.ts +++ b/packages/bundler/src/index.ts @@ -1,3 +1,8 @@ -export * from "./interfaces/IBundler"; -export * from "./Bundler"; -export * from "./utils/Types"; +import { Bundler } from "./Bundler.js"; + +export * from "./interfaces/IBundler.js"; +export * from "./Bundler.js"; +export * from "./utils/Types.js"; +export * from "./utils/Utils.js"; + +export const createBundler = Bundler.create; diff --git a/packages/bundler/src/interfaces/IBundler.ts b/packages/bundler/src/interfaces/IBundler.ts index f6d38164d..8ba7ccb50 100644 --- a/packages/bundler/src/interfaces/IBundler.ts +++ b/packages/bundler/src/interfaces/IBundler.ts @@ -1,12 +1,12 @@ -import { UserOpResponse, UserOpGasResponse, UserOpReceipt, UserOpByHashResponse, GasFeeValues, UserOpStatus, SimulationType } from "../utils/Types"; -import { UserOperation } from "@biconomy/core-types"; +import { UserOpResponse, UserOpGasResponse, UserOpReceipt, UserOpByHashResponse, UserOpStatus, SimulationType, GasFeeValues } from "../utils/Types"; +import { UserOperationStruct } from "@alchemy/aa-core"; export interface IBundler { - estimateUserOpGas(_userOp: Partial): Promise; - // could have second arg object called options - sendUserOp(_userOp: UserOperation, _simulationType?: SimulationType): Promise; + estimateUserOpGas(_userOp: Partial): Promise; + sendUserOp(_userOp: UserOperationStruct, _simulationType?: SimulationType): Promise; getUserOpReceipt(_userOpHash: string): Promise; getUserOpByHash(_userOpHash: string): Promise; getGasFeeValues(): Promise; getUserOpStatus(_userOpHash: string): Promise; + getBundlerUrl(): string; } diff --git a/packages/bundler/src/utils/Constants.ts b/packages/bundler/src/utils/Constants.ts index 5a0a2ae3b..8ffd436a5 100644 --- a/packages/bundler/src/utils/Constants.ts +++ b/packages/bundler/src/utils/Constants.ts @@ -1,149 +1,27 @@ -import { ChainId } from "@biconomy/core-types"; - -// eslint-disable-next-line no-unused-vars -export const UserOpReceiptIntervals: { [key in ChainId]?: number } = { - [ChainId.MAINNET]: 10000, - [ChainId.GOERLI]: 2000, - [ChainId.POLYGON_MUMBAI]: 2000, - [ChainId.POLYGON_MAINNET]: 2000, - [ChainId.BSC_TESTNET]: 2000, - [ChainId.BSC_MAINNET]: 2000, - [ChainId.POLYGON_ZKEVM_TESTNET]: 2000, - [ChainId.POLYGON_ZKEVM_MAINNET]: 2000, - [ChainId.ARBITRUM_GOERLI_TESTNET]: 2000, - [ChainId.ARBITRUM_ONE_MAINNET]: 2000, - [ChainId.ARBITRUM_NOVA_MAINNET]: 2000, - [ChainId.OPTIMISM_MAINNET]: 2000, - [ChainId.OPTIMISM_GOERLI_TESTNET]: 2000, - [ChainId.AVALANCHE_MAINNET]: 2000, - [ChainId.AVALANCHE_TESTNET]: 2000, - [ChainId.MOONBEAM_MAINNET]: 2000, - [ChainId.BASE_GOERLI_TESTNET]: 2000, - [ChainId.BASE_MAINNET]: 2000, - [ChainId.LINEA_TESTNET]: 2000, - [ChainId.LINEA_MAINNET]: 2000, - [ChainId.MANTLE_MAINNET]: 2000, - [ChainId.MANTLE_TESTNET]: 2000, - [ChainId.OPBNB_MAINNET]: 2000, - [ChainId.OPBNB_TESTNET]: 2000, - [ChainId.ASTAR_MAINNET]: 2000, - [ChainId.ASTAR_TESTNET]: 2000, - [ChainId.CHILIZ_MAINNET]: 2000, - [ChainId.CHILIZ_TESTNET]: 2000, - [ChainId.CORE_MAINNET]: 2000, - [ChainId.CORE_TESTNET]: 2000, - [ChainId.MANTA_PACIFIC_MAINNET]: 2000, - [ChainId.MANTA_PACIFIC_TESTNET]: 2000, - [ChainId.CAPX_TESTNET]: 2000, +export const UserOpReceiptIntervals: { [key in number]?: number } = { + [1]: 10000, }; -// Note: Reduced by 1/10th.. can reduce more -export const UserOpWaitForTxHashIntervals: { [key in ChainId]?: number } = { - [ChainId.MAINNET]: 1000, - [ChainId.GOERLI]: 500, - [ChainId.POLYGON_MUMBAI]: 500, - [ChainId.POLYGON_MAINNET]: 500, - [ChainId.BSC_TESTNET]: 500, - [ChainId.BSC_MAINNET]: 500, - [ChainId.POLYGON_ZKEVM_TESTNET]: 500, - [ChainId.POLYGON_ZKEVM_MAINNET]: 500, - [ChainId.ARBITRUM_GOERLI_TESTNET]: 500, - [ChainId.ARBITRUM_ONE_MAINNET]: 500, - [ChainId.ARBITRUM_NOVA_MAINNET]: 500, - [ChainId.OPTIMISM_MAINNET]: 500, - [ChainId.OPTIMISM_GOERLI_TESTNET]: 500, - [ChainId.AVALANCHE_MAINNET]: 500, - [ChainId.AVALANCHE_TESTNET]: 500, - [ChainId.MOONBEAM_MAINNET]: 500, - [ChainId.BASE_GOERLI_TESTNET]: 500, - [ChainId.BASE_MAINNET]: 500, - [ChainId.LINEA_TESTNET]: 500, - [ChainId.LINEA_MAINNET]: 500, - [ChainId.MANTLE_MAINNET]: 500, - [ChainId.MANTLE_TESTNET]: 500, - [ChainId.OPBNB_MAINNET]: 500, - [ChainId.OPBNB_TESTNET]: 500, - [ChainId.ASTAR_MAINNET]: 500, - [ChainId.ASTAR_TESTNET]: 500, - [ChainId.CHILIZ_MAINNET]: 500, - [ChainId.CHILIZ_TESTNET]: 500, - [ChainId.CORE_MAINNET]: 500, - [ChainId.CORE_TESTNET]: 500, - [ChainId.MANTA_PACIFIC_MAINNET]: 500, - [ChainId.MANTA_PACIFIC_TESTNET]: 500, - [ChainId.CAPX_TESTNET]: 500, +// Note: Default value is 500(0.5sec) +export const UserOpWaitForTxHashIntervals: { [key in number]?: number } = { + [1]: 1000, }; -export const UserOpReceiptMaxDurationIntervals: { [key in ChainId]?: number } = { - [ChainId.MAINNET]: 300000, - [ChainId.GOERLI]: 50000, - [ChainId.POLYGON_MUMBAI]: 50000, - [ChainId.POLYGON_MAINNET]: 60000, - [ChainId.BSC_TESTNET]: 50000, - [ChainId.BSC_MAINNET]: 50000, - [ChainId.POLYGON_ZKEVM_TESTNET]: 40000, - [ChainId.POLYGON_ZKEVM_MAINNET]: 40000, - [ChainId.ARBITRUM_GOERLI_TESTNET]: 50000, - [ChainId.ARBITRUM_ONE_MAINNET]: 50000, - [ChainId.ARBITRUM_NOVA_MAINNET]: 30000, - [ChainId.OPTIMISM_MAINNET]: 40000, - [ChainId.OPTIMISM_GOERLI_TESTNET]: 40000, - [ChainId.AVALANCHE_MAINNET]: 40000, - [ChainId.AVALANCHE_TESTNET]: 40000, - [ChainId.MOONBEAM_MAINNET]: 40000, - [ChainId.BASE_GOERLI_TESTNET]: 40000, - [ChainId.BASE_MAINNET]: 40000, - [ChainId.LINEA_TESTNET]: 50000, - [ChainId.LINEA_MAINNET]: 50000, - [ChainId.MANTLE_MAINNET]: 40000, - [ChainId.MANTLE_TESTNET]: 40000, - [ChainId.OPBNB_MAINNET]: 40000, - [ChainId.OPBNB_TESTNET]: 40000, - [ChainId.ASTAR_MAINNET]: 40000, - [ChainId.ASTAR_TESTNET]: 40000, - [ChainId.CHILIZ_MAINNET]: 40000, - [ChainId.CHILIZ_TESTNET]: 40000, - [ChainId.CORE_MAINNET]: 40000, - [ChainId.CORE_TESTNET]: 40000, - [ChainId.MANTA_PACIFIC_MAINNET]: 40000, - [ChainId.MANTA_PACIFIC_TESTNET]: 40000, - [ChainId.CAPX_TESTNET]: 40000, +// Note: Default value is 30000 (30sec) +export const UserOpReceiptMaxDurationIntervals: { [key in number]?: number } = { + [1]: 300000, + [80001]: 50000, + [137]: 60000, + [56]: 50000, + [97]: 50000, + [421613]: 50000, + [42161]: 50000, + [59140]: 50000, // linea testnet }; -export const UserOpWaitForTxHashMaxDurationIntervals: { [key in ChainId]?: number } = { - [ChainId.MAINNET]: 20000, - [ChainId.GOERLI]: 20000, - [ChainId.POLYGON_MUMBAI]: 20000, - [ChainId.POLYGON_MAINNET]: 20000, - [ChainId.BSC_TESTNET]: 20000, - [ChainId.BSC_MAINNET]: 20000, - [ChainId.POLYGON_ZKEVM_TESTNET]: 20000, - [ChainId.POLYGON_ZKEVM_MAINNET]: 20000, - [ChainId.ARBITRUM_GOERLI_TESTNET]: 20000, - [ChainId.ARBITRUM_ONE_MAINNET]: 20000, - [ChainId.ARBITRUM_NOVA_MAINNET]: 20000, - [ChainId.OPTIMISM_MAINNET]: 20000, - [ChainId.OPTIMISM_GOERLI_TESTNET]: 20000, - [ChainId.AVALANCHE_MAINNET]: 20000, - [ChainId.AVALANCHE_TESTNET]: 20000, - [ChainId.MOONBEAM_MAINNET]: 20000, - [ChainId.BASE_GOERLI_TESTNET]: 20000, - [ChainId.BASE_MAINNET]: 20000, - [ChainId.LINEA_TESTNET]: 20000, - [ChainId.LINEA_MAINNET]: 20000, - [ChainId.MANTLE_MAINNET]: 20000, - [ChainId.MANTLE_TESTNET]: 20000, - [ChainId.OPBNB_MAINNET]: 20000, - [ChainId.OPBNB_TESTNET]: 20000, - [ChainId.ASTAR_MAINNET]: 20000, - [ChainId.ASTAR_TESTNET]: 20000, - [ChainId.CHILIZ_MAINNET]: 20000, - [ChainId.CHILIZ_TESTNET]: 20000, - [ChainId.CORE_MAINNET]: 20000, - [ChainId.CORE_TESTNET]: 20000, - [ChainId.MANTA_PACIFIC_MAINNET]: 20000, - [ChainId.MANTA_PACIFIC_TESTNET]: 20000, - [ChainId.CAPX_TESTNET]: 20000, +// Note: Default value is 20000 (20sec) +export const UserOpWaitForTxHashMaxDurationIntervals: { [key in number]?: number } = { + [1]: 20000, }; export const DEFAULT_ENTRYPOINT_ADDRESS = "0x5ff137d4b0fdcd49dca30c7cf57e578a026d2789"; diff --git a/packages/bundler/src/utils/HelperFunction.ts b/packages/bundler/src/utils/HelperFunction.ts index a0d0240e4..670e04d31 100644 --- a/packages/bundler/src/utils/HelperFunction.ts +++ b/packages/bundler/src/utils/HelperFunction.ts @@ -1,10 +1,10 @@ -import { UserOperation } from "@biconomy/core-types"; -import { BigNumber } from "ethers"; +import type { BigNumberish, UserOperationStruct } from "@alchemy/aa-core"; -export const transformUserOP = (userOp: UserOperation): UserOperation => { +// Will convert the userOp hex, bigInt and number values to hex strings +export const transformUserOP = (userOp: UserOperationStruct): UserOperationStruct => { try { const userOperation = { ...userOp }; - const keys: (keyof UserOperation)[] = [ + const keys: (keyof UserOperationStruct)[] = [ "nonce", "callGasLimit", "verificationGasLimit", @@ -13,8 +13,8 @@ export const transformUserOP = (userOp: UserOperation): UserOperation => { "maxPriorityFeePerGas", ]; for (const key of keys) { - if (userOperation[key] && userOperation[key] !== "0") { - userOperation[key] = BigNumber.from(userOp[key]).toHexString(); + if (userOperation[key] && userOperation[key] !== "0x") { + userOperation[key] = ("0x" + BigInt(userOp[key] as BigNumberish).toString(16)) as `0x${string}`; } } return userOperation; @@ -22,3 +22,11 @@ export const transformUserOP = (userOp: UserOperation): UserOperation => { throw `Failed to transform user operation: ${error}`; } }; + +/** + * @description this function will return current timestamp in seconds + * @returns Number + */ +export const getTimestampInSeconds = (): number => { + return Math.floor(Date.now() / 1000); +}; diff --git a/packages/bundler/src/utils/Types.ts b/packages/bundler/src/utils/Types.ts index 6e93489d9..746d1b24e 100644 --- a/packages/bundler/src/utils/Types.ts +++ b/packages/bundler/src/utils/Types.ts @@ -1,29 +1,37 @@ -import { ethers, BigNumber } from "ethers"; -import { ChainId, UserOperation } from "@biconomy/core-types"; +import { UserOperationStruct } from "@alchemy/aa-core"; +import { Hex } from "viem"; export type Bundlerconfig = { bundlerUrl: string; entryPointAddress?: string; - chainId: ChainId; + chainId?: number; // eslint-disable-next-line no-unused-vars - userOpReceiptIntervals?: { [key in ChainId]?: number }; - userOpWaitForTxHashIntervals?: { [key in ChainId]?: number }; - userOpReceiptMaxDurationIntervals?: { [key in ChainId]?: number }; - userOpWaitForTxHashMaxDurationIntervals?: { [key in ChainId]?: number }; + userOpReceiptIntervals?: { [key in number]?: number }; + userOpWaitForTxHashIntervals?: { [key in number]?: number }; + userOpReceiptMaxDurationIntervals?: { [key in number]?: number }; + userOpWaitForTxHashMaxDurationIntervals?: { [key in number]?: number }; }; +export type BundlerConfigWithChainId = Bundlerconfig & { chainId: number }; export type UserOpReceipt = { + /* The request hash of the UserOperation. */ userOpHash: string; + /* The entry point address used for the UserOperation. */ entryPoint: string; - sender: string; - nonce: number; + /* The paymaster used for this UserOperation (or empty). */ paymaster: string; - actualGasCost: BigNumber; - actualGasUsed: BigNumber; + /* The actual amount paid (by account or paymaster) for this UserOperation. */ + actualGasCost: Hex; + /* The total gas used by this UserOperation (including preVerification, creation, validation, and execution). */ + actualGasUsed: Hex; + /* Indicates whether the execution completed without reverting. */ success: "true" | "false"; + /* In case of revert, this is the revert reason. */ reason: string; - logs: Array; // The logs generated by this UserOperation (not including logs of other UserOperations in the same bundle) - receipt: ethers.providers.TransactionReceipt; + /* The logs generated by this UserOperation (not including logs of other UserOperations in the same bundle). */ + logs: Array; // The logs generated by this UserOperation (not including logs of other UserOperations in the same bundle) + /* The TransactionReceipt object for the entire bundle, not only for this UserOperation. */ + receipt: any; }; // review @@ -89,7 +97,7 @@ export type GetUserOpByHashResponse = { error?: JsonRpcError; }; -export type UserOpByHashResponse = UserOperation & { +export type UserOpByHashResponse = UserOperationStruct & { transactionHash: string; blockNumber: number; blockHash: string; diff --git a/packages/bundler/src/utils/Utils.ts b/packages/bundler/src/utils/Utils.ts new file mode 100644 index 000000000..a64420100 --- /dev/null +++ b/packages/bundler/src/utils/Utils.ts @@ -0,0 +1,9 @@ +export const extractChainIdFromBundlerUrl = (url: string): number => { + try { + const regex = /\/api\/v2\/(\d+)\/[a-zA-Z0-9.-]+$/; + const match = regex.exec(url)!; + return parseInt(match[1]); + } catch (error) { + throw new Error("Invalid chain id"); + } +}; diff --git a/packages/bundler/tests/bundler.e2e.spec.ts b/packages/bundler/tests/bundler.e2e.spec.ts new file mode 100644 index 000000000..7b9211dd0 --- /dev/null +++ b/packages/bundler/tests/bundler.e2e.spec.ts @@ -0,0 +1,19 @@ +import { TestData } from "../../../tests"; + +describe("Bundler Unit Tests", () => { + let mumbai: TestData; + let baseSepolia: TestData; + + beforeEach(() => { + // @ts-ignore: Comes from setup-e2e-tests + [mumbai, baseSepolia] = testDataPerChain; + }); + + it("should have chain data for mumbai", () => { + expect(mumbai).toHaveProperty("chainId"); + }); + + it("should also have chain data for base", () => { + expect(baseSepolia).toHaveProperty("chainId"); + }); +}); diff --git a/packages/bundler/tests/bundler.spec.ts b/packages/bundler/tests/bundler.spec.ts index 3c8a14354..e663dafb4 100644 --- a/packages/bundler/tests/bundler.spec.ts +++ b/packages/bundler/tests/bundler.spec.ts @@ -1,5 +1,14 @@ -describe("Bundler Tests", () => { - it("should have a basic test", () => { - expect(true).toBe(true); +import { TestData } from "../../../tests"; + +describe("Bundler Unit Tests", () => { + let ganache: TestData; + + beforeEach(() => { + // @ts-ignore: Comes from setup-unit-tests + [ganache] = testDataPerChain; + }); + + it("should have chain data for ganache", () => { + expect(ganache).toHaveProperty("chainId"); }); }); diff --git a/packages/bundler/tsconfig.build.json b/packages/bundler/tsconfig.build.json new file mode 100644 index 000000000..4ac8b8026 --- /dev/null +++ b/packages/bundler/tsconfig.build.json @@ -0,0 +1,32 @@ +{ + "$schema": "https://json.schemastore.org/tsconfig", + "display": "Build", + "compilerOptions": { + "lib": ["es2022", "dom"], + "target": "es2021", + "types": ["node"], + "allowJs": false, + "skipLibCheck": true, + "esModuleInterop": true, + "allowSyntheticDefaultImports": true, + "strict": true, + "forceConsistentCasingInFileNames": true, + "module": "esnext", + "moduleResolution": "node", + "resolveJsonModule": true, + "isolatedModules": true, + "verbatimModuleSyntax": false, + "useDefineForClassFields": true, + "noFallthroughCasesInSwitch": true, + "noImplicitReturns": true, + "useUnknownInCatchVariables": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "declaration": true, + "inlineSources": true, + "noEmit": false, + "sourceMap": true + }, + "exclude": ["**/*/node_modules", "**/*/tests", "tests"], + "include": ["src"] +} \ No newline at end of file diff --git a/packages/bundler/tsconfig.json b/packages/bundler/tsconfig.json index 3dc5293ed..d9b305a9a 100644 --- a/packages/bundler/tsconfig.json +++ b/packages/bundler/tsconfig.json @@ -5,7 +5,9 @@ "outDir": "dist", "baseUrl": "src", "resolveJsonModule": true, - "esModuleInterop": true + "esModuleInterop": true, + "lib": ["es2020"], + "types": ["node"] }, "include": ["src", "src/**/*.json"] } diff --git a/packages/common/.depcheckrc b/packages/common/.depcheckrc deleted file mode 100644 index c0d8d09e2..000000000 --- a/packages/common/.depcheckrc +++ /dev/null @@ -1 +0,0 @@ -ignores: ["@openzeppelin/contracts"] diff --git a/packages/common/.esbuild.js b/packages/common/.esbuild.js new file mode 100644 index 000000000..ca355e346 --- /dev/null +++ b/packages/common/.esbuild.js @@ -0,0 +1,58 @@ +const esbuildPluginTsc = require("esbuild-plugin-tsc"); +const esbuild = require("esbuild"); +const { dependencies, peerDependencies = {} } = require("./package.json"); +const { Generator } = require("npm-dts"); + +const COMMON_SETTINGS = { + entryPoints: ["src/index.ts"], + minify: true, + bundle: true, + plugins: [esbuildPluginTsc({ force: true })], +}; + +const ESM_SETTINGS = { + ...COMMON_SETTINGS, + sourcemap: true, + outfile: "dist/esm/index.js", + platform: "browser", + target: "esnext", + format: "esm", + mainFields: ["browser", "module", "main"], +}; +const buildForESM = async () => await esbuild.build(ESM_SETTINGS); + +const CJS_SETTINGS = { + ...COMMON_SETTINGS, + format: "cjs", + sourcemap: false, + outfile: "dist/cjs/index.js", + platform: "node", +}; + +const watchForCJS = async () => { + let ctx = await esbuild.context(CJS_SETTINGS); + await ctx.watch(); + await ctx.serve({ servedir: "dist/src" }); + console.log("watching..."); +}; + +const buildForCJS = async () => await esbuild.build(CJS_SETTINGS); +const buildForTYP = async () => await new Generator({ entry: "src/index.ts", output: "dist/types/index.d.ts" }).generate(); + +(async () => { + const buildType = process.argv.slice(2)[0]; + const shouldWatch = process.argv.slice(3)[0] === "--watch"; + if (!buildType) { + console.log("No build type provided"); + process.exit(1); + } + console.log(`Building for ${buildType}`); + if (buildType === "ESM") { + await buildForESM(); + } else if (buildType === "CJS") { + console.log("watching? " + shouldWatch); + await (shouldWatch ? watchForCJS : buildForCJS)(); + } else if (buildType === "TYP") { + await buildForTYP(); + } +})(); diff --git a/packages/common/CHANGELOG.md b/packages/common/CHANGELOG.md deleted file mode 100644 index 19b8a3b6d..000000000 --- a/packages/common/CHANGELOG.md +++ /dev/null @@ -1,126 +0,0 @@ -# Change Log - -All notable changes to this project will be documented in this file. -See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. - -## 3.1.3 (2023-12-28) - -* update capx url and rebase ([92c1ef0](https://github.com/bcnmy/biconomy-client-sdk/pull/360/commits/92c1ef0fcfeafbd89a6872b1e2689eea7c722bc3)) - -## 3.1.2 (2023-12-28) - -VERSION Bump Only. - - -## 3.1.1 (2023-11-09) - - -### Features - -* add linea mainnet ([c3d1283](https://github.com/bcnmy/biconomy-client-sdk/commit/c3d12832002c18e187f910b5f7dac5ef5b797abf)) - - - -## 3.1.0 (2023-09-20) - - -### Bug Fixes - -* comment out hardcoded gas limit in any case + fix value for estimate smart-account deployment + dev notes ([df48ec3](https://github.com/bcnmy/biconomy-client-sdk/commit/df48ec3c04cf44a8f64eb302217655076c6304a4)) -* error handling ([637bb67](https://github.com/bcnmy/biconomy-client-sdk/commit/637bb67b9390e39b4571374108bc70447a531963)) -* lint warning and errors ([2135498](https://github.com/bcnmy/biconomy-client-sdk/commit/2135498896beb54d25add820c1521ffa22d5db7c)) -* linting ([563befe](https://github.com/bcnmy/biconomy-client-sdk/commit/563befedcc37aee4c531e01809b47e559a33f526)) -* linting ([d2f5f1a](https://github.com/bcnmy/biconomy-client-sdk/commit/d2f5f1afadc2a561c4ef01c0821a25b9d7fe776e)) -* more lint issues ([10df908](https://github.com/bcnmy/biconomy-client-sdk/commit/10df90821b473fd668907cf3e447dfe3825317fc)) -* undefined log issue ([42f3f70](https://github.com/bcnmy/biconomy-client-sdk/commit/42f3f7040c96ff5ac57459224b09a25f95d2cd8c)) - - -### Features - -* base mainnet integration ([c17f5d6](https://github.com/bcnmy/biconomy-client-sdk/commit/c17f5d6c2fe34b106e6d9755f54fab2493db6fbe)) -* chain integration ([ddc5d91](https://github.com/bcnmy/biconomy-client-sdk/commit/ddc5d91d5df10a10266f4500644d24e0bc1ea684)) -* chain integration ([738556e](https://github.com/bcnmy/biconomy-client-sdk/commit/738556efcfda70fedc652befc0b35f8835c5e360)) -* improve logs ([fb15af3](https://github.com/bcnmy/biconomy-client-sdk/commit/fb15af3af48ccf50101fedd7f9bb44ee97c747c4)) -* sdk test spec improvement ([fd80048](https://github.com/bcnmy/biconomy-client-sdk/commit/fd80048db7a60d34412dcb00f6dd8bb202f41ad3)) - - - - - -## 3.0.0 (2023-08-28) - - -### Features - -* base mainnet integration ([c17f5d6](https://github.com/bcnmy/biconomy-client-sdk/commit/c17f5d6c2fe34b106e6d9755f54fab2493db6fbe)) - - - -## 3.0.0-alpha.0 (2023-08-02) - -VERSION Bump Only. - - - -# 3.1.0-alpha.0 (2023-07-24) - - - -### Features - -* chain integration ([738556e](https://github.com/bcnmy/biconomy-client-sdk/commit/738556efcfda70fedc652befc0b35f8835c5e360)) - - - -## 3.0.0-alpha.0 (2023-07-12) - - -### Bug Fixes - -* bundler sync changes ([eb9b30d](https://github.com/bcnmy/biconomy-client-sdk/commit/eb9b30d786820b4c9a6a18c72481d0ed3782a22e)) - - -## 2.0.2 (2023-06-10) - -* smart account state types to have factory address added - - -## 2.0.1 (2023-05-18) - - -### Bug Fixes - -* logic update ([41c4aec](https://github.com/bcnmy/biconomy-client-sdk/commit/41c4aec8ab5012b7ad362b2870966bd607e38636)) -* fix build issue in angular for relative path (https://github.com/bcnmy/biconomy-client-sdk/commit/eb9b30d786820b4c9a6a18c72481d0ed3782a22e) - - -### Features - -* chain integrations ([9af2da0](https://github.com/bcnmy/biconomy-client-sdk/commit/9af2da03820a26ac7d21301c32de041ced6c5e43)) -* Type added for PaymasterServiceData + reordering of params ([fae8b3a](https://github.com/bcnmy/biconomy-client-sdk/commit/fae8b3a02a5e810a9a40674d27f389b89199bb62)) -* logic changed to accept paymasterServiceData ([6daaf37](https://github.com/bcnmy/biconomy-client-sdk/commit/6daaf37855a13fa6e12fdbab16a7e980b4631475)) -* UserOpGasFields for fetching gas and gas prices from bundler (https://github.com/bcnmy/biconomy-client-sdk/commit/a0c070b04bb6e249388a7d304dad7d08e97810e1) -* skipBundlerGasEstimation added in dto update CreateUserPaidTransactionDto ([487f3ae](https://github.com/bcnmy/biconomy-client-sdk/commit/487f3aefe21b2dd4fd46e18bef7168eae3c1ecc1)) -* fetching gas prices from bundler ([a0c070b](https://github.com/bcnmy/biconomy-client-sdk/commit/a0c070b04bb6e249388a7d304dad7d08e97810e1)) - - - - - - -## 2.0.0 (2023-04-07) - - -### Bug Fixes - -* backend contract address ([e81188d](https://github.com/bcnmy/biconomy-client-sdk/commit/e81188d454eb42ab581078d218d86571d724fa2d)) -* multisend bundle ([5f55587](https://github.com/bcnmy/biconomy-client-sdk/commit/5f55587b63c82a30652843fe619d8b891e495399)) -* optional sign flag ([0d689d2](https://github.com/bcnmy/biconomy-client-sdk/commit/0d689d214fc7abf32f4f2deabcce61041b73d642)) - - -## 1.0.0 (2023-01-03) - - -### Bug Fixes - -* optional sign flag ([0d689d2](https://github.com/bcnmy/biconomy-client-sdk/commit/0d689d214fc7abf32f4f2deabcce61041b73d642)) diff --git a/packages/common/README.md b/packages/common/README.md index 8876292b9..db4c4a8c7 100644 --- a/packages/common/README.md +++ b/packages/common/README.md @@ -2,7 +2,7 @@ common utils -methods for processing UserOperations +common methods for other biconomy packages ## Usage diff --git a/packages/common/abis/biconomy_v1.0.0/SmartAccountFactory_v1.0.0.json b/packages/common/abis/biconomy_v1.0.0/SmartAccountFactory_v1.0.0.json deleted file mode 100644 index 6fe41a20a..000000000 --- a/packages/common/abis/biconomy_v1.0.0/SmartAccountFactory_v1.0.0.json +++ /dev/null @@ -1,172 +0,0 @@ -{ - "_format": "hh-sol-artifact-1", - "contractName": "SmartAccountFactory", - "sourceName": "contracts/smart-contract-wallet/SmartAccountFactory.sol", - "abi": [ - { - "inputs": [ - { - "internalType": "address", - "name": "_basicImplementation", - "type": "address" - } - ], - "stateMutability": "nonpayable", - "type": "constructor" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "account", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "owner", - "type": "address" - }, - { - "indexed": true, - "internalType": "uint256", - "name": "index", - "type": "uint256" - } - ], - "name": "AccountCreation", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "account", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "owner", - "type": "address" - } - ], - "name": "AccountCreationWithoutIndex", - "type": "event" - }, - { - "inputs": [], - "name": "accountCreationCode", - "outputs": [ - { - "internalType": "bytes", - "name": "", - "type": "bytes" - } - ], - "stateMutability": "pure", - "type": "function" - }, - { - "inputs": [], - "name": "basicImplementation", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_owner", - "type": "address" - } - ], - "name": "deployAccount", - "outputs": [ - { - "internalType": "address", - "name": "proxy", - "type": "address" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_owner", - "type": "address" - }, - { - "internalType": "uint256", - "name": "_index", - "type": "uint256" - } - ], - "name": "deployCounterFactualAccount", - "outputs": [ - { - "internalType": "address", - "name": "proxy", - "type": "address" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_owner", - "type": "address" - }, - { - "internalType": "uint256", - "name": "_index", - "type": "uint256" - } - ], - "name": "getAddressForCounterFactualAccount", - "outputs": [ - { - "internalType": "address", - "name": "_account", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "minimalHandler", - "outputs": [ - { - "internalType": "contract DefaultCallbackHandler", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - } - ], - "bytecode": "0x60c060405234801561001057600080fd5b50604051610f5a380380610f5a83398101604081905261002f916100de565b6001600160a01b0381166100895760405162461bcd60e51b815260206004820152601d60248201527f696d706c656d656e746174696f6e2063616e6e6f74206265207a65726f000000604482015260640160405180910390fd5b6001600160a01b0381166080526040516100a2906100d1565b604051809103906000f0801580156100be573d6000803e3d6000fd5b506001600160a01b031660a0525061010e565b6105e68061097483390190565b6000602082840312156100f057600080fd5b81516001600160a01b038116811461010757600080fd5b9392505050565b60805160a05161082661014e6000396000818160c1015261056501526000818161010e015281816101b10152818161032b015261043f01526108266000f3fe608060405234801561001057600080fd5b50600436106100725760003560e01c8063d668bfa811610050578063d668bfa8146100e3578063da9fc1ae146100f6578063daf0dfc81461010957600080fd5b8063088924ef1461007757806331c884df146100a75780633b3cb143146100bc575b600080fd5b61008a6100853660046105fe565b610130565b6040516001600160a01b0390911681526020015b60405180910390f35b6100af6102bd565b60405161009e919061064c565b61008a7f000000000000000000000000000000000000000000000000000000000000000081565b61008a6100f13660046105fe565b6102e7565b61008a61010436600461067f565b610408565b61008a7f000000000000000000000000000000000000000000000000000000000000000081565b60008061013c84610550565b90506000818051906020012084604051602001610163929190918252602082015260400190565b60405160208183030381529060405280519060200120905060006040518060200161018d906105d5565b601f1982820381018352601f9091011660408190526101da91906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906020016106a1565b6040516020818303038152906040529050818151826020016000f593506001600160a01b0384166102525760405162461bcd60e51b815260206004820152601360248201527f437265617465322063616c6c206661696c65640000000000000000000000000060448201526064015b60405180910390fd5b8251156102735760008060008551602087016000895af10361027357600080fd5b84866001600160a01b0316856001600160a01b03167f8967dcaa00d8fcb9bb2b5beff4aaf8c020063512cf08fbe11fec37a1e3a150f260405160405180910390a450505092915050565b6060604051806020016102cf906105d5565b601f1982820381018352601f90910116604052919050565b6000806102f384610550565b9050600060405180602001610307906105d5565b601f1982820381018352601f90910116604081905261035491906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906020016106a1565b60408051808303601f1901815282825284516020958601208584015282820196909652805180830382018152606080840183528151918601919091208751978601979097207fff0000000000000000000000000000000000000000000000000000000000000060808501523090911b6bffffffffffffffffffffffff19166081840152609583019690965260b5808301969096528051808303909601865260d5909101905250825192019190912092915050565b6000806040518060200161041b906105d5565b601f1982820381018352601f90910116604081905261046891906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906020016106a1565b60405160208183030381529060405290508051816020016000f091506001600160a01b0382166104da5760405162461bcd60e51b815260206004820152601260248201527f4372656174652063616c6c206661696c656400000000000000000000000000006044820152606401610249565b60006104e584610550565b8051909150156105095760008060008351602085016000885af10361050957600080fd5b836001600160a01b0316836001600160a01b03167f9a6cbf173278cf7dfadb45414d824f7828c0c94479f1b15e45453653070cf65760405160405180910390a35050919050565b6040516001600160a01b0380831660248301527f000000000000000000000000000000000000000000000000000000000000000016604482015260609060640160408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1663784d200b60e11b17905292915050565b61012d806106c483390190565b80356001600160a01b03811681146105f957600080fd5b919050565b6000806040838503121561061157600080fd5b61061a836105e2565b946020939093013593505050565b60005b8381101561064357818101518382015260200161062b565b50506000910152565b602081526000825180602084015261066b816040850160208701610628565b601f01601f19169190910160400192915050565b60006020828403121561069157600080fd5b61069a826105e2565b9392505050565b600083516106b3818460208801610628565b919091019182525060200191905056fe608060405234801561001057600080fd5b5060405161012d38038061012d83398101604081905261002f91610090565b6001600160a01b0381166100895760405162461bcd60e51b815260206004820152601e60248201527f496e76616c696420696d706c656d656e746174696f6e20616464726573730000604482015260640160405180910390fd5b30556100c0565b6000602082840312156100a257600080fd5b81516001600160a01b03811681146100b957600080fd5b9392505050565b605f806100ce6000396000f3fe608060405230543660008037600080366000845af43d6000803e8080156024573d6000f35b3d6000fdfea2646970667358221220a7977748230fa5c96134083773f708cfbe78723c07e58051ac6bd8c4877a4d5a64736f6c63430008110033a26469706673582212201fec0df9ef9e79bf19660229f5fa1cf6bbf67a01bd022c1b6866ccb255550e5764736f6c63430008110033608060405234801561001057600080fd5b506105c6806100206000396000f3fe608060405234801561001057600080fd5b506004361061007c5760003560e01c8063a3f4df7e1161005b578063a3f4df7e146100fb578063bc197c8114610144578063f23a6e6114610166578063ffa1ad741461018657600080fd5b806223de291461008157806301ffc9a71461009b578063150b7a02146100c3575b600080fd5b61009961008f3660046102a0565b5050505050505050565b005b6100ae6100a936600461034b565b6101c2565b60405190151581526020015b60405180910390f35b6100e26100d136600461037c565b630a85bd0160e11b95945050505050565b6040516001600160e01b031990911681526020016100ba565b6101376040518060400160405280601881526020017f44656661756c742043616c6c6261636b2048616e646c6572000000000000000081525081565b6040516100ba91906103eb565b6100e261015236600461047e565b63bc197c8160e01b98975050505050505050565b6100e2610174366004610518565b63f23a6e6160e01b9695505050505050565b6101376040518060400160405280600581526020017f312e302e3000000000000000000000000000000000000000000000000000000081525081565b60006001600160e01b03198216630271189760e51b14806101f357506001600160e01b03198216630a85bd0160e11b145b8061020d57506001600160e01b031982166223de2960e01b145b8061022857506001600160e01b031982166301ffc9a760e01b145b92915050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461025257600080fd5b919050565b60008083601f84011261026957600080fd5b50813567ffffffffffffffff81111561028157600080fd5b60208301915083602082850101111561029957600080fd5b9250929050565b60008060008060008060008060c0898b0312156102bc57600080fd5b6102c58961022e565b97506102d360208a0161022e565b96506102e160408a0161022e565b955060608901359450608089013567ffffffffffffffff8082111561030557600080fd5b6103118c838d01610257565b909650945060a08b013591508082111561032a57600080fd5b506103378b828c01610257565b999c989b5096995094979396929594505050565b60006020828403121561035d57600080fd5b81356001600160e01b03198116811461037557600080fd5b9392505050565b60008060008060006080868803121561039457600080fd5b61039d8661022e565b94506103ab6020870161022e565b935060408601359250606086013567ffffffffffffffff8111156103ce57600080fd5b6103da88828901610257565b969995985093965092949392505050565b600060208083528351808285015260005b81811015610418578581018301518582016040015282016103fc565b506000604082860101526040601f19601f8301168501019250505092915050565b60008083601f84011261044b57600080fd5b50813567ffffffffffffffff81111561046357600080fd5b6020830191508360208260051b850101111561029957600080fd5b60008060008060008060008060a0898b03121561049a57600080fd5b6104a38961022e565b97506104b160208a0161022e565b9650604089013567ffffffffffffffff808211156104ce57600080fd5b6104da8c838d01610439565b909850965060608b01359150808211156104f357600080fd5b6104ff8c838d01610439565b909650945060808b013591508082111561032a57600080fd5b60008060008060008060a0878903121561053157600080fd5b61053a8761022e565b95506105486020880161022e565b94506040870135935060608701359250608087013567ffffffffffffffff81111561057257600080fd5b61057e89828a01610257565b979a969950949750929593949250505056fea2646970667358221220f9bf68273e40153fec1c25026a3e3145e43e4e63c519d4413921bbc86925381c64736f6c63430008110033", - "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100725760003560e01c8063d668bfa811610050578063d668bfa8146100e3578063da9fc1ae146100f6578063daf0dfc81461010957600080fd5b8063088924ef1461007757806331c884df146100a75780633b3cb143146100bc575b600080fd5b61008a6100853660046105fe565b610130565b6040516001600160a01b0390911681526020015b60405180910390f35b6100af6102bd565b60405161009e919061064c565b61008a7f000000000000000000000000000000000000000000000000000000000000000081565b61008a6100f13660046105fe565b6102e7565b61008a61010436600461067f565b610408565b61008a7f000000000000000000000000000000000000000000000000000000000000000081565b60008061013c84610550565b90506000818051906020012084604051602001610163929190918252602082015260400190565b60405160208183030381529060405280519060200120905060006040518060200161018d906105d5565b601f1982820381018352601f9091011660408190526101da91906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906020016106a1565b6040516020818303038152906040529050818151826020016000f593506001600160a01b0384166102525760405162461bcd60e51b815260206004820152601360248201527f437265617465322063616c6c206661696c65640000000000000000000000000060448201526064015b60405180910390fd5b8251156102735760008060008551602087016000895af10361027357600080fd5b84866001600160a01b0316856001600160a01b03167f8967dcaa00d8fcb9bb2b5beff4aaf8c020063512cf08fbe11fec37a1e3a150f260405160405180910390a450505092915050565b6060604051806020016102cf906105d5565b601f1982820381018352601f90910116604052919050565b6000806102f384610550565b9050600060405180602001610307906105d5565b601f1982820381018352601f90910116604081905261035491906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906020016106a1565b60408051808303601f1901815282825284516020958601208584015282820196909652805180830382018152606080840183528151918601919091208751978601979097207fff0000000000000000000000000000000000000000000000000000000000000060808501523090911b6bffffffffffffffffffffffff19166081840152609583019690965260b5808301969096528051808303909601865260d5909101905250825192019190912092915050565b6000806040518060200161041b906105d5565b601f1982820381018352601f90910116604081905261046891906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906020016106a1565b60405160208183030381529060405290508051816020016000f091506001600160a01b0382166104da5760405162461bcd60e51b815260206004820152601260248201527f4372656174652063616c6c206661696c656400000000000000000000000000006044820152606401610249565b60006104e584610550565b8051909150156105095760008060008351602085016000885af10361050957600080fd5b836001600160a01b0316836001600160a01b03167f9a6cbf173278cf7dfadb45414d824f7828c0c94479f1b15e45453653070cf65760405160405180910390a35050919050565b6040516001600160a01b0380831660248301527f000000000000000000000000000000000000000000000000000000000000000016604482015260609060640160408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1663784d200b60e11b17905292915050565b61012d806106c483390190565b80356001600160a01b03811681146105f957600080fd5b919050565b6000806040838503121561061157600080fd5b61061a836105e2565b946020939093013593505050565b60005b8381101561064357818101518382015260200161062b565b50506000910152565b602081526000825180602084015261066b816040850160208701610628565b601f01601f19169190910160400192915050565b60006020828403121561069157600080fd5b61069a826105e2565b9392505050565b600083516106b3818460208801610628565b919091019182525060200191905056fe608060405234801561001057600080fd5b5060405161012d38038061012d83398101604081905261002f91610090565b6001600160a01b0381166100895760405162461bcd60e51b815260206004820152601e60248201527f496e76616c696420696d706c656d656e746174696f6e20616464726573730000604482015260640160405180910390fd5b30556100c0565b6000602082840312156100a257600080fd5b81516001600160a01b03811681146100b957600080fd5b9392505050565b605f806100ce6000396000f3fe608060405230543660008037600080366000845af43d6000803e8080156024573d6000f35b3d6000fdfea2646970667358221220a7977748230fa5c96134083773f708cfbe78723c07e58051ac6bd8c4877a4d5a64736f6c63430008110033a26469706673582212201fec0df9ef9e79bf19660229f5fa1cf6bbf67a01bd022c1b6866ccb255550e5764736f6c63430008110033", - "linkReferences": {}, - "deployedLinkReferences": {} -} diff --git a/packages/common/abis/biconomy_v1.0.0/SmartAccount_v1.0.0.json b/packages/common/abis/biconomy_v1.0.0/SmartAccount_v1.0.0.json deleted file mode 100644 index 541727bee..000000000 --- a/packages/common/abis/biconomy_v1.0.0/SmartAccount_v1.0.0.json +++ /dev/null @@ -1,1682 +0,0 @@ -{ - "_format": "hh-sol-artifact-1", - "contractName": "SmartAccount", - "sourceName": "contracts/smart-contract-wallet/SmartAccount.sol", - "abi": [ - { - "inputs": [ - { - "internalType": "contract IEntryPoint", - "name": "anEntryPoint", - "type": "address" - } - ], - "stateMutability": "nonpayable", - "type": "constructor" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "smartAccount", - "type": "address" - } - ], - "name": "AlreadyInitialized", - "type": "error" - }, - { - "inputs": [], - "name": "BaseImplementationCannotBeZero", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "caller", - "type": "address" - } - ], - "name": "CallerIsNotAnEntryPoint", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "caller", - "type": "address" - } - ], - "name": "CallerIsNotEntryPointOrOwner", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "caller", - "type": "address" - } - ], - "name": "CallerIsNotOwner", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "caller", - "type": "address" - } - ], - "name": "CallerIsNotSelf", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "targetTxGas", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "gasPrice", - "type": "uint256" - }, - { - "internalType": "bool", - "name": "success", - "type": "bool" - } - ], - "name": "CanNotEstimateGas", - "type": "error" - }, - { - "inputs": [], - "name": "DelegateCallsOnly", - "type": "error" - }, - { - "inputs": [], - "name": "EntryPointCannotBeZero", - "type": "error" - }, - { - "inputs": [], - "name": "ExecutionFailed", - "type": "error" - }, - { - "inputs": [], - "name": "HandlerCannotBeZero", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "implementationAddress", - "type": "address" - } - ], - "name": "InvalidImplementation", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "restoredSigner", - "type": "address" - }, - { - "internalType": "address", - "name": "expectedSigner", - "type": "address" - } - ], - "name": "InvalidSignature", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "caller", - "type": "address" - } - ], - "name": "MixedAuthFail", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "module", - "type": "address" - } - ], - "name": "ModuleAlreadyEnabled", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "expectedModule", - "type": "address" - }, - { - "internalType": "address", - "name": "returnedModule", - "type": "address" - }, - { - "internalType": "address", - "name": "prevModule", - "type": "address" - } - ], - "name": "ModuleAndPrevModuleMismatch", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "module", - "type": "address" - } - ], - "name": "ModuleCannotBeZeroOrSentinel", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "module", - "type": "address" - } - ], - "name": "ModuleNotEnabled", - "type": "error" - }, - { - "inputs": [], - "name": "ModulesAlreadyInitialized", - "type": "error" - }, - { - "inputs": [], - "name": "ModulesSetupExecutionFailed", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "gasLeft", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "gasRequired", - "type": "uint256" - } - ], - "name": "NotEnoughGasLeft", - "type": "error" - }, - { - "inputs": [], - "name": "OwnerCanNotBeSelf", - "type": "error" - }, - { - "inputs": [], - "name": "OwnerCannotBeZero", - "type": "error" - }, - { - "inputs": [], - "name": "OwnerProvidedIsSame", - "type": "error" - }, - { - "inputs": [], - "name": "ReentrancyProtectionActivated", - "type": "error" - }, - { - "inputs": [], - "name": "TokenGasPriceFactorCanNotBeZero", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "token", - "type": "address" - }, - { - "internalType": "address", - "name": "dest", - "type": "address" - }, - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "name": "TokenTransferFailed", - "type": "error" - }, - { - "inputs": [], - "name": "TransferToZeroAddressAttempt", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "destLength", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "valueLength", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "funcLength", - "type": "uint256" - } - ], - "name": "WrongBatchProvided", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "bytes", - "name": "contractSignature", - "type": "bytes" - } - ], - "name": "WrongContractSignature", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "uintS", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "contractSignatureLength", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "signatureLength", - "type": "uint256" - } - ], - "name": "WrongContractSignatureFormat", - "type": "error" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "bytes32", - "name": "txHash", - "type": "bytes32" - }, - { - "indexed": true, - "internalType": "uint256", - "name": "payment", - "type": "uint256" - } - ], - "name": "AccountHandlePayment", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "previousHandler", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "handler", - "type": "address" - } - ], - "name": "ChangedFallbackHandler", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "address", - "name": "module", - "type": "address" - } - ], - "name": "DisabledModule", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "_scw", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "_oldEOA", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "_newEOA", - "type": "address" - } - ], - "name": "EOAChanged", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "address", - "name": "module", - "type": "address" - } - ], - "name": "EnabledModule", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "indexed": true, - "internalType": "uint256", - "name": "value", - "type": "uint256" - }, - { - "indexed": true, - "internalType": "bytes", - "name": "data", - "type": "bytes" - }, - { - "indexed": false, - "internalType": "enum Enum.Operation", - "name": "operation", - "type": "uint8" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "txGas", - "type": "uint256" - } - ], - "name": "ExecutionFailure", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "module", - "type": "address" - } - ], - "name": "ExecutionFromModuleFailure", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "module", - "type": "address" - } - ], - "name": "ExecutionFromModuleSuccess", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "indexed": true, - "internalType": "uint256", - "name": "value", - "type": "uint256" - }, - { - "indexed": true, - "internalType": "bytes", - "name": "data", - "type": "bytes" - }, - { - "indexed": false, - "internalType": "enum Enum.Operation", - "name": "operation", - "type": "uint8" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "txGas", - "type": "uint256" - } - ], - "name": "ExecutionSuccess", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "oldImplementation", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "newImplementation", - "type": "address" - } - ], - "name": "ImplementationUpdated", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "address", - "name": "module", - "type": "address" - }, - { - "indexed": false, - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "value", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "bytes", - "name": "data", - "type": "bytes" - }, - { - "indexed": false, - "internalType": "enum Enum.Operation", - "name": "operation", - "type": "uint8" - } - ], - "name": "ModuleTransaction", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "sender", - "type": "address" - }, - { - "indexed": true, - "internalType": "uint256", - "name": "value", - "type": "uint256" - } - ], - "name": "SmartAccountReceivedNativeToken", - "type": "event" - }, - { - "stateMutability": "nonpayable", - "type": "fallback" - }, - { - "inputs": [], - "name": "VERSION", - "outputs": [ - { - "internalType": "string", - "name": "", - "type": "string" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "addDeposit", - "outputs": [], - "stateMutability": "payable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "dataHash", - "type": "bytes32" - }, - { - "internalType": "bytes", - "name": "signatures", - "type": "bytes" - } - ], - "name": "checkSignatures", - "outputs": [], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "prevModule", - "type": "address" - }, - { - "internalType": "address", - "name": "module", - "type": "address" - } - ], - "name": "disableModule", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "domainSeparator", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "module", - "type": "address" - } - ], - "name": "enableModule", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "components": [ - { - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "internalType": "enum Enum.Operation", - "name": "operation", - "type": "uint8" - }, - { - "internalType": "uint256", - "name": "value", - "type": "uint256" - }, - { - "internalType": "bytes", - "name": "data", - "type": "bytes" - }, - { - "internalType": "uint256", - "name": "targetTxGas", - "type": "uint256" - } - ], - "internalType": "struct Transaction", - "name": "_tx", - "type": "tuple" - }, - { - "components": [ - { - "internalType": "uint256", - "name": "baseGas", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "gasPrice", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "tokenGasPriceFactor", - "type": "uint256" - }, - { - "internalType": "address", - "name": "gasToken", - "type": "address" - }, - { - "internalType": "address payable", - "name": "refundReceiver", - "type": "address" - } - ], - "internalType": "struct FeeRefund", - "name": "refundInfo", - "type": "tuple" - }, - { - "internalType": "uint256", - "name": "_nonce", - "type": "uint256" - } - ], - "name": "encodeTransactionData", - "outputs": [ - { - "internalType": "bytes", - "name": "", - "type": "bytes" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "entryPoint", - "outputs": [ - { - "internalType": "contract IEntryPoint", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "components": [ - { - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "internalType": "enum Enum.Operation", - "name": "operation", - "type": "uint8" - }, - { - "internalType": "uint256", - "name": "value", - "type": "uint256" - }, - { - "internalType": "bytes", - "name": "data", - "type": "bytes" - }, - { - "internalType": "uint256", - "name": "targetTxGas", - "type": "uint256" - } - ], - "internalType": "struct Transaction", - "name": "_tx", - "type": "tuple" - }, - { - "components": [ - { - "internalType": "uint256", - "name": "baseGas", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "gasPrice", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "tokenGasPriceFactor", - "type": "uint256" - }, - { - "internalType": "address", - "name": "gasToken", - "type": "address" - }, - { - "internalType": "address payable", - "name": "refundReceiver", - "type": "address" - } - ], - "internalType": "struct FeeRefund", - "name": "refundInfo", - "type": "tuple" - }, - { - "internalType": "bytes", - "name": "signatures", - "type": "bytes" - } - ], - "name": "execTransaction", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "payable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "internalType": "uint256", - "name": "value", - "type": "uint256" - }, - { - "internalType": "bytes", - "name": "data", - "type": "bytes" - }, - { - "internalType": "enum Enum.Operation", - "name": "operation", - "type": "uint8" - } - ], - "name": "execTransactionFromModule", - "outputs": [ - { - "internalType": "bool", - "name": "success", - "type": "bool" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "internalType": "uint256", - "name": "value", - "type": "uint256" - }, - { - "internalType": "bytes", - "name": "data", - "type": "bytes" - }, - { - "internalType": "enum Enum.Operation", - "name": "operation", - "type": "uint8" - } - ], - "name": "execTransactionFromModuleReturnData", - "outputs": [ - { - "internalType": "bool", - "name": "success", - "type": "bool" - }, - { - "internalType": "bytes", - "name": "returnData", - "type": "bytes" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "components": [ - { - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "internalType": "enum Enum.Operation", - "name": "operation", - "type": "uint8" - }, - { - "internalType": "uint256", - "name": "value", - "type": "uint256" - }, - { - "internalType": "bytes", - "name": "data", - "type": "bytes" - }, - { - "internalType": "uint256", - "name": "targetTxGas", - "type": "uint256" - } - ], - "internalType": "struct Transaction", - "name": "_tx", - "type": "tuple" - }, - { - "components": [ - { - "internalType": "uint256", - "name": "baseGas", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "gasPrice", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "tokenGasPriceFactor", - "type": "uint256" - }, - { - "internalType": "address", - "name": "gasToken", - "type": "address" - }, - { - "internalType": "address payable", - "name": "refundReceiver", - "type": "address" - } - ], - "internalType": "struct FeeRefund", - "name": "refundInfo", - "type": "tuple" - }, - { - "internalType": "bytes", - "name": "signatures", - "type": "bytes" - } - ], - "name": "execTransaction_S6W", - "outputs": [ - { - "internalType": "bool", - "name": "success", - "type": "bool" - } - ], - "stateMutability": "payable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address[]", - "name": "dest", - "type": "address[]" - }, - { - "internalType": "uint256[]", - "name": "value", - "type": "uint256[]" - }, - { - "internalType": "bytes[]", - "name": "func", - "type": "bytes[]" - } - ], - "name": "executeBatchCall", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address[]", - "name": "dest", - "type": "address[]" - }, - { - "internalType": "uint256[]", - "name": "value", - "type": "uint256[]" - }, - { - "internalType": "bytes[]", - "name": "func", - "type": "bytes[]" - } - ], - "name": "executeBatchCall_4by", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "dest", - "type": "address" - }, - { - "internalType": "uint256", - "name": "value", - "type": "uint256" - }, - { - "internalType": "bytes", - "name": "func", - "type": "bytes" - } - ], - "name": "executeCall", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "dest", - "type": "address" - }, - { - "internalType": "uint256", - "name": "value", - "type": "uint256" - }, - { - "internalType": "bytes", - "name": "func", - "type": "bytes" - } - ], - "name": "executeCall_s1m", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "getChainId", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "getDeposit", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "getFallbackHandler", - "outputs": [ - { - "internalType": "address", - "name": "_handler", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "getImplementation", - "outputs": [ - { - "internalType": "address", - "name": "_implementation", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "start", - "type": "address" - }, - { - "internalType": "uint256", - "name": "pageSize", - "type": "uint256" - } - ], - "name": "getModulesPaginated", - "outputs": [ - { - "internalType": "address[]", - "name": "array", - "type": "address[]" - }, - { - "internalType": "address", - "name": "next", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "batchId", - "type": "uint256" - } - ], - "name": "getNonce", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "internalType": "uint256", - "name": "value", - "type": "uint256" - }, - { - "internalType": "bytes", - "name": "data", - "type": "bytes" - }, - { - "internalType": "enum Enum.Operation", - "name": "operation", - "type": "uint8" - }, - { - "internalType": "uint256", - "name": "targetTxGas", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "baseGas", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "gasPrice", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "tokenGasPriceFactor", - "type": "uint256" - }, - { - "internalType": "address", - "name": "gasToken", - "type": "address" - }, - { - "internalType": "address payable", - "name": "refundReceiver", - "type": "address" - }, - { - "internalType": "uint256", - "name": "_nonce", - "type": "uint256" - } - ], - "name": "getTransactionHash", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "gasUsed", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "baseGas", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "gasPrice", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "tokenGasPriceFactor", - "type": "uint256" - }, - { - "internalType": "address", - "name": "gasToken", - "type": "address" - }, - { - "internalType": "address payable", - "name": "refundReceiver", - "type": "address" - } - ], - "name": "handlePaymentRevert", - "outputs": [ - { - "internalType": "uint256", - "name": "requiredGas", - "type": "uint256" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_owner", - "type": "address" - }, - { - "internalType": "address", - "name": "_handler", - "type": "address" - } - ], - "name": "init", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "module", - "type": "address" - } - ], - "name": "isModuleEnabled", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "_dataHash", - "type": "bytes32" - }, - { - "internalType": "bytes", - "name": "_signature", - "type": "bytes" - } - ], - "name": "isValidSignature", - "outputs": [ - { - "internalType": "bytes4", - "name": "", - "type": "bytes4" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "nonce", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "name": "nonces", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "owner", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "token", - "type": "address" - }, - { - "internalType": "address", - "name": "dest", - "type": "address" - }, - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "name": "pullTokens", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "internalType": "uint256", - "name": "value", - "type": "uint256" - }, - { - "internalType": "bytes", - "name": "data", - "type": "bytes" - }, - { - "internalType": "enum Enum.Operation", - "name": "operation", - "type": "uint8" - } - ], - "name": "requiredTxGas", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "handler", - "type": "address" - } - ], - "name": "setFallbackHandler", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_newOwner", - "type": "address" - } - ], - "name": "setOwner", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes4", - "name": "_interfaceId", - "type": "bytes4" - } - ], - "name": "supportsInterface", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address payable", - "name": "dest", - "type": "address" - }, - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "name": "transfer", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_implementation", - "type": "address" - } - ], - "name": "updateImplementation", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "components": [ - { - "internalType": "address", - "name": "sender", - "type": "address" - }, - { - "internalType": "uint256", - "name": "nonce", - "type": "uint256" - }, - { - "internalType": "bytes", - "name": "initCode", - "type": "bytes" - }, - { - "internalType": "bytes", - "name": "callData", - "type": "bytes" - }, - { - "internalType": "uint256", - "name": "callGasLimit", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "verificationGasLimit", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "preVerificationGas", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "maxFeePerGas", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "maxPriorityFeePerGas", - "type": "uint256" - }, - { - "internalType": "bytes", - "name": "paymasterAndData", - "type": "bytes" - }, - { - "internalType": "bytes", - "name": "signature", - "type": "bytes" - } - ], - "internalType": "struct UserOperation", - "name": "userOp", - "type": "tuple" - }, - { - "internalType": "bytes32", - "name": "userOpHash", - "type": "bytes32" - }, - { - "internalType": "uint256", - "name": "missingAccountFunds", - "type": "uint256" - } - ], - "name": "validateUserOp", - "outputs": [ - { - "internalType": "uint256", - "name": "validationData", - "type": "uint256" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address payable", - "name": "withdrawAddress", - "type": "address" - }, - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "name": "withdrawDepositTo", - "outputs": [], - "stateMutability": "payable", - "type": "function" - }, - { - "stateMutability": "payable", - "type": "receive" - } - ], - "bytecode": "0x60e06040523480156200001157600080fd5b5060405162003915380380620039158339810160408190526200003491620000a1565b60016031553060c052603280546001600160a01b03191673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee1790556001600160a01b0381166200008b5760405163091748f960e21b815260040160405180910390fd5b6001600160a01b03166080524660a052620000d3565b600060208284031215620000b457600080fd5b81516001600160a01b0381168114620000cc57600080fd5b9392505050565b60805160a05160c0516137e86200012d60003960006102af015260006104ed01526000818161078701528181610dcf01528181610f2c01528181610fd901528181611935015281816119c6015261204f01526137e86000f3fe6080604052600436106102a05760003560e01c80638da5cb5b1161016e578063c399ec88116100cb578063f08a03231161007f578063f698da2511610064578063f698da251461088e578063fc7d3d79146108f7578063ffa1ad741461090a5761031c565b8063f08a03231461084e578063f09a40161461086e5761031c565b8063cc2f8452116100b0578063cc2f8452146107e0578063e009cfde1461080e578063ed516d511461082e5761031c565b8063c399ec88146107ab578063c4ca3a9c146107c05761031c565b8063aaf10f4211610122578063ac85dca711610107578063ac85dca714610743578063affed0e014610763578063b0d691fe146107785761031c565b8063aaf10f421461070f578063abc1b745146107235761031c565b80639e5d4c49116101535780639e5d4c49146106af578063a18f51e5146106cf578063a9059cbb146106ef5761031c565b80638da5cb5b1461066f578063912ccaa31461068f5761031c565b80633a871cdd1161021c5780635229073f116101d0578063610b5925116101b5578063610b5925146105f45780637455ce3c14610614578063856dfd99146106275761031c565b80635229073f146105995780635c0ba299146105c75761031c565b8063468721a711610201578063468721a71461055e5780634a58db191461057e5780634d44560d146105865761031c565b80633a871cdd146105115780633d46b819146105315761031c565b806313af4035116102735780631626ba7e116102585780631626ba7e146104855780632d9ad53d146104be5780633408e470146104de5761031c565b806313af40351461042a578063141a468c1461044a5761031c565b80610772146103825780618f2d146103a457806301ffc9a7146103c4578063025b22bc1461040a5761031c565b3661031c576001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001630036102ee57604051633c97166560e21b815260040160405180910390fd5b604051349033907ed05ab44e279ac59e855cb75dc2ae23b200ad994797b6f1f028f96a46ecce0290600090a3005b34801561032857600080fd5b507f6c9a6c4a39284e37ed1cf53d337577d14212a4870fb976a4366c693b939918d480548061035357005b36600080373360601b365260008060143601600080855af190503d6000803e8061037c573d6000fd5b503d6000f35b34801561038e57600080fd5b506103a261039d366004612ab2565b610953565b005b3480156103b057600080fd5b506103a26103bf366004612b53565b6109a2565b3480156103d057600080fd5b506103f56103df366004612c03565b6001600160e01b0319166301ffc9a760e01b1490565b60405190151581526020015b60405180910390f35b34801561041657600080fd5b506103a2610425366004612c20565b610ab3565b34801561043657600080fd5b506103a2610445366004612c20565b610bbb565b34801561045657600080fd5b50610477610465366004612c3d565b60336020526000908152604090205481565b604051908152602001610401565b34801561049157600080fd5b506104a56104a0366004612d22565b610cbd565b6040516001600160e01b03199091168152602001610401565b3480156104ca57600080fd5b506103f56104d9366004612c20565b610d8a565b3480156104ea57600080fd5b507f0000000000000000000000000000000000000000000000000000000000000000610477565b34801561051d57600080fd5b5061047761052c366004612d69565b610dc2565b34801561053d57600080fd5b5061047761054c366004612c3d565b60009081526033602052604090205490565b34801561056a57600080fd5b506103f5610579366004612dcc565b610e2b565b6103a2610f2a565b6103a2610594366004612e36565b610faa565b3480156105a557600080fd5b506105b96105b4366004612dcc565b611060565b604051610401929190612eb2565b3480156105d357600080fd5b506105e76105e2366004612fad565b611096565b6040516104019190613005565b34801561060057600080fd5b506103a261060f366004612c20565b6111f0565b6103f5610622366004613018565b611316565b34801561063357600080fd5b507f6c9a6c4a39284e37ed1cf53d337577d14212a4870fb976a4366c693b939918d4545b6040516001600160a01b039091168152602001610401565b34801561067b57600080fd5b50603254610657906001600160a01b031681565b34801561069b57600080fd5b506103a26106aa366004612b53565b611554565b3480156106bb57600080fd5b506103a26106ca366004612ab2565b611562565b3480156106db57600080fd5b506104776106ea36600461308d565b61156e565b3480156106fb57600080fd5b506103a261070a366004612e36565b611707565b34801561071b57600080fd5b503054610657565b34801561072f57600080fd5b5061047761073e3660046130eb565b6117a5565b34801561074f57600080fd5b506103a261075e3660046131b3565b611878565b34801561076f57600080fd5b5061047761190e565b34801561078457600080fd5b507f0000000000000000000000000000000000000000000000000000000000000000610657565b3480156107b757600080fd5b506104776119a6565b3480156107cc57600080fd5b506104776107db3660046131f4565b6119f5565b3480156107ec57600080fd5b506108006107fb366004612e36565b611a6e565b604051610401929190613265565b34801561081a57600080fd5b506103a26108293660046132c2565b611b67565b34801561083a57600080fd5b506103a2610849366004612d22565b611c99565b34801561085a57600080fd5b506103a2610869366004612c20565b611f2b565b34801561087a57600080fd5b506103a26108893660046132c2565b611fa2565b34801561089a57600080fd5b50610477604080517f47e79534a245952e8b16893a336b85a3d9ea9fa8c573f3d803afb92a794692186020820152469181019190915230606082015260009060800160405160208183030381529060405280519060200120905090565b6103f5610905366004613018565b612037565b34801561091657600080fd5b506105e76040518060400160405280600581526020017f312e302e3000000000000000000000000000000000000000000000000000000081525081565b61095b612044565b61099c848484848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506120aa92505050565b50505050565b6109aa612044565b8415806109b75750848314155b806109c25750828114155b156109f657604051630a0c0a9160e31b81526004810186905260248101849052604481018290526064015b60405180910390fd5b60005b85811015610aaa57610aa2878783818110610a1657610a166132fb565b9050602002016020810190610a2b9190612c20565b868684818110610a3d57610a3d6132fb565b90506020020135858585818110610a5657610a566132fb565b9050602002810190610a689190613311565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506120aa92505050565b6001016109f9565b50505050505050565b6032546001600160a01b03163314801590610ace5750333014155b15610aee576040516308a0b0a560e11b81523360048201526024016109ed565b6001600160a01b038116610b445760405162461bcd60e51b815260206004820152601660248201527f416464726573732063616e6e6f74206265207a65726f0000000000000000000060448201526064016109ed565b6001600160a01b0381163b610b7757604051630c76093760e01b81526001600160a01b03821660048201526024016109ed565b308054908290556040516001600160a01b0380841691908316907faa3f731066a578e5f39b4215468d826cdd15373cbc0dfc9cb9bdc649718ef7da90600090a35050565b6032546001600160a01b03163314801590610bd65750333014155b15610bf6576040516308a0b0a560e11b81523360048201526024016109ed565b6001600160a01b038116610c1d57604051639b15e16f60e01b815260040160405180910390fd5b306001600160a01b03821603610c46576040516375b4d24760e01b815260040160405180910390fd5b6032546001600160a01b0390811690821603610c7557604051638a95d3fb60e01b815260040160405180910390fd5b60328054908290556040516001600160a01b0391821691831690829030907ff2c2b1b5312b1e31ad49a7d85acd6322ae6facc51488810b882ecdb4df861cd490600090a45050565b6032546000906001600160a01b03163b15610d4c57603254604051630b135d3f60e11b81526001600160a01b0390911690631626ba7e90610d049086908690600401613358565b602060405180830381865afa158015610d21573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d459190613371565b9050610d84565b610d5683836120c8565b6032546001600160a01b03918216911603610d795750630b135d3f60e11b610d84565b506001600160e01b03195b92915050565b600060016001600160a01b03831614801590610d845750506001600160a01b0390811660009081526020819052604090205416151590565b6000336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610e0f57604051635dac3db760e11b81523360048201526024016109ed565b610e1984846120ec565b9050610e24826122dd565b9392505050565b60003360011480610e525750336000908152602081905260409020546001600160a01b0316155b15610e72576040516321ac7c5f60e01b81523360048201526024016109ed565b610e7f858585855a612328565b90508015610ef6577f8c014e41cffd68ba64f3e7830b8b2e4ee860509d8deab25ebbcbba2f0405e2da3386868686604051610ebe9594939291906133c6565b60405180910390a160405133907f6895c13664aa4f67288b25d7a21d7aaa34916e355fb9b6fae0a139a9085becb890600090a2610f22565b60405133907facd2c8702804128fdb0db2bb49f6d127dd0181c13fd45dbfe16de0930e2bd37590600090a25b949350505050565b7f000000000000000000000000000000000000000000000000000000000000000060405163b760faf960e01b81523060048201526001600160a01b03919091169063b760faf99034906024016000604051808303818588803b158015610f8f57600080fd5b505af1158015610fa3573d6000803e3d6000fd5b5050505050565b6032546001600160a01b03163314610fd75760405163d4ed9a1760e01b81523360048201526024016109ed565b7f000000000000000000000000000000000000000000000000000000000000000060405163040b850f60e31b81526001600160a01b03848116600483015260248201849052919091169063205c287890604401600060405180830381600087803b15801561104457600080fd5b505af1158015611058573d6000803e3d6000fd5b505050505050565b6000606061107086868686610e2b565b915060405160203d0181016040523d81523d6000602083013e8091505094509492505050565b606060007fda033865d68bf4a40a5a7cb4159a99e33dba8569e65ea3e38222eb12d9e66eee60001b856000015186604001518760600151805190602001208860200151896080015189600001518a602001518b604001518c606001518d608001518d6040516020016111139c9b9a99989796959493929190613411565b60408051601f1981840301815291905280516020909101209050601960f81b600160f81b611193604080517f47e79534a245952e8b16893a336b85a3d9ea9fa8c573f3d803afb92a794692186020820152469181019190915230606082015260009060800160405160208183030381529060405280519060200120905090565b6040517fff0000000000000000000000000000000000000000000000000000000000000093841660208201529290911660218301526022820152604281018290526062016040516020818303038152906040529150509392505050565b6111f861242f565b6001600160a01b038116158061121757506001600160a01b0381166001145b156112405760405163cadb248f60e01b81526001600160a01b03821660048201526024016109ed565b6001600160a01b0381811660009081526020819052604090205416156112845760405163b29d459560e01b81526001600160a01b03821660048201526024016109ed565b600060208181527fada5013122d395ba3c54772283fb069b10426056ef8ca54750cb9bb552a59e7d80546001600160a01b0385811680865260408087208054939094166001600160a01b03199384161790935560019095528254168417909155519182527fecdf3a3effea5783a3c4c2140e677577666428d44ed9d474a0b3a4c9943f8440910160405180910390a150565b600060026031540361133b57604051637465d9d160e01b815260040160405180910390fd5b600260315560005a6001600090815260336020527f10f6f77027d502f219862b0303542eb5dd005b06fa23ff4d1775aaa45bbf94778054929350909182916113959189918991908561138c836134a0565b91905055611096565b80516020820120925090506113aa8286611c99565b506113d9603f60068860800151901b6113c391906134b9565b60808801516113d4906109c46134db565b612451565b6113e5906101f46134db565b5a1015611444575a611416603f60068960800151901b61140591906134b9565b60808901516113d4906109c46134db565b611422906101f46134db565b604051633b4daac960e01b8152600481019290925260248201526044016109ed565b61148486600001518760400151886060015189602001518960200151600014611471578a60800151612328565b6109c45a61147f91906134ee565b612328565b92508215801561149657506080860151155b80156114a457506020850151155b156114dd5760808601516020860151604051631061f87f60e31b81526004810192909252602482015283151560448201526064016109ed565b60008560200151600014611545576115145a6114f990856134ee565b8751602089015160408a015160608b015160808c0151612467565b905080827f3fd74c38c9f1b6f0499c6d0128fbf77a796dbacc7eda0369b13006dc977bb56b60405160405180910390a35b50506001603155509392505050565b6110588686868686866109a2565b61099c84848484610953565b6000836000036115c05760405162461bcd60e51b815260206004820152601b60248201527f696e76616c696420746f6b656e4761735072696365466163746f72000000000060448201526064016109ed565b60005a905060006001600160a01b038416156115dc57836115de565b325b90506001600160a01b0385166116615760003a88106115fd573a6115ff565b875b6116098a8c6134db565b6116139190613501565b9050600080600080600085875af190508061165a5760405163190eecf360e31b8152600060048201526001600160a01b0384166024820152604481018390526064016109ed565b50506116c9565b6000868861166f8b8d6134db565b6116799190613501565b61168391906134b9565b9050611690868383612592565b6116c75760405163190eecf360e31b81526001600160a01b03808816600483015283166024820152604481018290526064016109ed565b505b5a82039250826040516020016116e191815260200190565b60408051601f198184030181529082905262461bcd60e51b82526109ed91600401613005565b6032546001600160a01b031633146117345760405163d4ed9a1760e01b81523360048201526024016109ed565b6001600160a01b03821661175b576040516309293b1960e41b815260040160405180910390fd5b600080600080600085875af19050806117a05760405163190eecf360e31b8152600060048201526001600160a01b0384166024820152604481018390526064016109ed565b505050565b6000806040518060a001604052808f6001600160a01b031681526020018b60018111156117d4576117d461338e565b81526020018e81526020018d8d8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050509082525060209081018b90526040805160a0810182528b81529182018a905281018890526001600160a01b0380881660608301528616608082015290915061185d828286611096565b80519060200120925050509c9b505050505050505050505050565b6032546001600160a01b031633146118a55760405163d4ed9a1760e01b81523360048201526024016109ed565b6001600160a01b0382166118cc576040516309293b1960e41b815260040160405180910390fd5b6118d7838383612592565b6117a05760405163190eecf360e31b81526001600160a01b03808516600483015283166024820152604481018290526064016109ed565b604051631aab3f0d60e11b8152306004820152600060248201819052906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906335567e1a906044015b602060405180830381865afa15801561197d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119a19190613518565b905090565b6040516370a0823160e01b81523060048201526000906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401611960565b6000805a9050611a3e878787878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525089925050505a612328565b611a5b57604051632b3f6d1160e21b815260040160405180910390fd5b5a604080519183036020830152016116e1565b606060008267ffffffffffffffff811115611a8b57611a8b612c56565b604051908082528060200260200182016040528015611ab4578160200160208202803683370190505b506001600160a01b0380861660009081526020819052604081205492945091165b6001600160a01b03811615801590611af757506001600160a01b038116600114155b8015611b0257508482105b15611b595780848381518110611b1a57611b1a6132fb565b6001600160a01b039283166020918202929092018101919091529181166000908152918290526040909120541681611b51816134a0565b925050611ad5565b908352919491935090915050565b611b6f61242f565b6001600160a01b0381161580611b8e57506001600160a01b0381166001145b15611bb75760405163cadb248f60e01b81526001600160a01b03821660048201526024016109ed565b6001600160a01b03828116600090815260208190526040902054811690821614611c1f576001600160a01b0382811660008181526020819052604090819020549051633103525b60e21b815284841660048201529216602483015260448201526064016109ed565b6001600160a01b03818116600081815260208181526040808320805488871685528285208054919097166001600160a01b03199182161790965592849052825490941690915591519081527faab4fa2b463f581b2b32cb3b7e3b704b9ce37cc209b5fb4d77e593ace4054276910160405180910390a15050565b604181511015611ceb5760405162461bcd60e51b815260206004820152601960248201527f496e76616c6964207369676e617475726573206c656e6774680000000000000060448201526064016109ed565b600080600080611d0e856020810151604082015160419092015160ff1692909190565b9195509350915060ff8416600003611e535750816041821015611d55576040516338a245ff60e11b81526004810183905260006024820181905260448201526064016109ed565b6020828601810151865190918290611d6e9086906134db565b611d7891906134db565b1115611dab5785516040516338a245ff60e11b8152600481018590526024810183905260448101919091526064016109ed565b604051630b135d3f60e11b808252878501602001916001600160a01b03851690631626ba7e90611de1908c908690600401613358565b602060405180830381865afa158015611dfe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e229190613371565b6001600160e01b03191614611e4c578060405163605d348960e01b81526004016109ed9190613005565b5050611ee6565b601e8460ff161115611ed657611ece611e6d600486613531565b8484611ec68a6040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b9291906126e3565b509050611ee6565b611ee2868585856126e3565b5090505b6032546001600160a01b03828116911614611058576032546040516310b5d43760e21b81526001600160a01b03808416600483015290911660248201526044016109ed565b611f3361242f565b7f6c9a6c4a39284e37ed1cf53d337577d14212a4870fb976a4366c693b939918d454611f5e826127a7565b816001600160a01b0316816001600160a01b03167f06be9a1bea257286cf2afa8205ed494ca9d6a4b41aa58d04238deebada20fb0c60405160405180910390a35050565b6032546001600160a01b031615611fce576040516393360fbf60e01b81523060048201526024016109ed565b6001600160a01b038216611ff557604051639b15e16f60e01b815260040160405180910390fd5b603280546001600160a01b0319166001600160a01b038416179055612019816127a7565b6120336000604051806020016040528060008152506127f2565b5050565b6000610f22848484611316565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161480159061208857506032546001600160a01b03163314155b156120a8576040516332dbd3c760e11b81523360048201526024016109ed565b565b60008082516020840185875af16040513d6000823e81610fa3573d81fd5b60008060006120d785856128bc565b915091506120e481612901565b509392505050565b600036816120fd6060860186613311565b90925090508015612204576000612117600482848661354a565b61212091613574565b90506361a2b3b760e01b6001600160e01b0319821601612202576000808061214b856004818961354a565b81019061215891906135a4565b6001600160a01b03808416600090815260208190526040902054939650919450925016156121fe57604051631179c1f560e11b81526001600160a01b038416906322f383ea906121ae908c908c90600401613662565b6020604051808303816000875af11580156121cd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121f19190613518565b9650505050505050610d84565b5050505b505b600061225d856040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b90506122ad612270610140880188613311565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525085939250506120c89050565b6032546001600160a01b039081169116146122ce5760019350505050610d84565b50600095945050505050565b50565b80156122da5760405133906000199083906000818181858888f193505050503d806000811461099c576040519150601f19603f3d011682016040523d82523d6000602084013e61099c565b6000600183600181111561233e5761233e61338e565b03612356576000808551602087018986f49050612366565b600080855160208701888a87f190505b80156123cb578360405161237a919061377b565b604051809103902085876001600160a01b03167f81d12fffced46c214dfae8ab8fa0b9f7b69f70c9d500e33f612f2105deb261ee86866040516123be929190613797565b60405180910390a4612426565b836040516123d9919061377b565b604051809103902085876001600160a01b03167f3ddd038f78c876172d5dbfd730b14c9f8692dfa197ef104eaac6df3f85a0874a868660405161241d929190613797565b60405180910390a45b95945050505050565b3330146120a8576040516301478e3360e21b81523360048201526024016109ed565b60008183116124605781610e24565b5090919050565b60008360000361248a5760405163653f35a360e01b815260040160405180910390fd5b60006001600160a01b038316156124a157826124a3565b325b90506001600160a01b038416612523573a86106124c0573a6124c2565b855b6124cc888a6134db565b6124d69190613501565b9150600080600080600086865af190508061251d5760405163190eecf360e31b8152600060048201526001600160a01b0383166024820152604481018490526064016109ed565b50612587565b848661252f898b6134db565b6125399190613501565b61254391906134b9565b9150612550848284612592565b6125875760405163190eecf360e31b81526001600160a01b03808616600483015282166024820152604481018390526064016109ed565b509695505050505050565b60006001600160a01b0384166125ea5760405162461bcd60e51b815260206004820152601d60248201527f746f6b656e2063616e206e6f74206265207a65726f206164647265737300000060448201526064016109ed565b6000846001600160a01b03163b116126445760405162461bcd60e51b815260206004820152601c60248201527f746f6b656e20636f6e747261637420646f65736e27742065786973740000000060448201526064016109ed565b604080516001600160a01b03851660248201526044808201859052825180830390910181526064909101909152602080820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1663a9059cbb60e01b178152825160009182896127105a03f13d80156126c657602081146126ce57600093506126d9565b8193506126d9565b600051158215171593505b5050509392505050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561271a575060009050600361279e565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa15801561276e573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166127975760006001925092505061279e565b9150600090505b94509492505050565b6001600160a01b0381166127ce5760405163dd449f5f60e01b815260040160405180910390fd5b7f6c9a6c4a39284e37ed1cf53d337577d14212a4870fb976a4366c693b939918d455565b600160009081526020527fada5013122d395ba3c54772283fb069b10426056ef8ca54750cb9bb552a59e7d546001600160a01b0316156128455760405163df8cc4e360e01b815260040160405180910390fd5b600160008181526020527fada5013122d395ba3c54772283fb069b10426056ef8ca54750cb9bb552a59e7d80546001600160a01b03191690911790556001600160a01b038216156120335761289f8260008360015a612328565b6120335760405163032e3a3960e51b815260040160405180910390fd5b60008082516041036128f25760208301516040840151606085015160001a6128e6878285856126e3565b945094505050506128fa565b506000905060025b9250929050565b60008160048111156129155761291561338e565b0361291d5750565b60018160048111156129315761293161338e565b0361297e5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e6174757265000000000000000060448201526064016109ed565b60028160048111156129925761299261338e565b036129df5760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e6774680060448201526064016109ed565b60038160048111156129f3576129f361338e565b036122da5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b60648201526084016109ed565b6001600160a01b03811681146122da57600080fd5b8035612a6b81612a4b565b919050565b60008083601f840112612a8257600080fd5b50813567ffffffffffffffff811115612a9a57600080fd5b6020830191508360208285010111156128fa57600080fd5b60008060008060608587031215612ac857600080fd5b8435612ad381612a4b565b935060208501359250604085013567ffffffffffffffff811115612af657600080fd5b612b0287828801612a70565b95989497509550505050565b60008083601f840112612b2057600080fd5b50813567ffffffffffffffff811115612b3857600080fd5b6020830191508360208260051b85010111156128fa57600080fd5b60008060008060008060608789031215612b6c57600080fd5b863567ffffffffffffffff80821115612b8457600080fd5b612b908a838b01612b0e565b90985096506020890135915080821115612ba957600080fd5b612bb58a838b01612b0e565b90965094506040890135915080821115612bce57600080fd5b50612bdb89828a01612b0e565b979a9699509497509295939492505050565b6001600160e01b0319811681146122da57600080fd5b600060208284031215612c1557600080fd5b8135610e2481612bed565b600060208284031215612c3257600080fd5b8135610e2481612a4b565b600060208284031215612c4f57600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b60405160a0810167ffffffffffffffff81118282101715612c8f57612c8f612c56565b60405290565b600082601f830112612ca657600080fd5b813567ffffffffffffffff80821115612cc157612cc1612c56565b604051601f8301601f19908116603f01168101908282118183101715612ce957612ce9612c56565b81604052838152866020858801011115612d0257600080fd5b836020870160208301376000602085830101528094505050505092915050565b60008060408385031215612d3557600080fd5b82359150602083013567ffffffffffffffff811115612d5357600080fd5b612d5f85828601612c95565b9150509250929050565b600080600060608486031215612d7e57600080fd5b833567ffffffffffffffff811115612d9557600080fd5b84016101608187031215612da857600080fd5b95602085013595506040909401359392505050565b803560028110612a6b57600080fd5b60008060008060808587031215612de257600080fd5b8435612ded81612a4b565b935060208501359250604085013567ffffffffffffffff811115612e1057600080fd5b612e1c87828801612c95565b925050612e2b60608601612dbd565b905092959194509250565b60008060408385031215612e4957600080fd5b8235612e5481612a4b565b946020939093013593505050565b60005b83811015612e7d578181015183820152602001612e65565b50506000910152565b60008151808452612e9e816020860160208601612e62565b601f01601f19169290920160200192915050565b8215158152604060208201526000610f226040830184612e86565b600060a08284031215612edf57600080fd5b612ee7612c6c565b90508135612ef481612a4b565b8152612f0260208301612dbd565b602082015260408201356040820152606082013567ffffffffffffffff811115612f2b57600080fd5b612f3784828501612c95565b6060830152506080820135608082015292915050565b600060a08284031215612f5f57600080fd5b612f67612c6c565b90508135815260208201356020820152604082013560408201526060820135612f8f81612a4b565b60608201526080820135612fa281612a4b565b608082015292915050565b600080600060e08486031215612fc257600080fd5b833567ffffffffffffffff811115612fd957600080fd5b612fe586828701612ecd565b935050612ff58560208601612f4d565b915060c084013590509250925092565b602081526000610e246020830184612e86565b600080600060e0848603121561302d57600080fd5b833567ffffffffffffffff8082111561304557600080fd5b61305187838801612ecd565b94506130608760208801612f4d565b935060c086013591508082111561307657600080fd5b5061308386828701612c95565b9150509250925092565b60008060008060008060c087890312156130a657600080fd5b8635955060208701359450604087013593506060870135925060808701356130cd81612a4b565b915060a08701356130dd81612a4b565b809150509295509295509295565b6000806000806000806000806000806000806101608d8f03121561310e57600080fd5b6131188d35612a4b565b8c359b5060208d01359a5067ffffffffffffffff60408e0135111561313c57600080fd5b61314c8e60408f01358f01612a70565b909a50985061315d60608e01612dbd565b975060808d0135965060a08d0135955060c08d0135945060e08d013593506101008d013561318a81612a4b565b92506131996101208e01612a60565b91506101408d013590509295989b509295989b509295989b565b6000806000606084860312156131c857600080fd5b83356131d381612a4b565b925060208401356131e381612a4b565b929592945050506040919091013590565b60008060008060006080868803121561320c57600080fd5b853561321781612a4b565b945060208601359350604086013567ffffffffffffffff81111561323a57600080fd5b61324688828901612a70565b9094509250613259905060608701612dbd565b90509295509295909350565b604080825283519082018190526000906020906060840190828701845b828110156132a75781516001600160a01b031684529284019290840190600101613282565b5050506001600160a01b039490941692019190915250919050565b600080604083850312156132d557600080fd5b82356132e081612a4b565b915060208301356132f081612a4b565b809150509250929050565b634e487b7160e01b600052603260045260246000fd5b6000808335601e1984360301811261332857600080fd5b83018035915067ffffffffffffffff82111561334357600080fd5b6020019150368190038213156128fa57600080fd5b828152604060208201526000610f226040830184612e86565b60006020828403121561338357600080fd5b8151610e2481612bed565b634e487b7160e01b600052602160045260246000fd5b600281106133c257634e487b7160e01b600052602160045260246000fd5b9052565b60006001600160a01b03808816835280871660208401525084604083015260a060608301526133f860a0830185612e86565b905061340760808301846133a4565b9695505050505050565b6000610180820190508d82526001600160a01b03808e1660208401528c60408401528b6060840152613446608084018c6133a4565b8960a08401528860c08401528760e08401528661010084015280861661012084015280851661014084015250826101608301529d9c50505050505050505050505050565b634e487b7160e01b600052601160045260246000fd5b6000600182016134b2576134b261348a565b5060010190565b6000826134d657634e487b7160e01b600052601260045260246000fd5b500490565b80820180821115610d8457610d8461348a565b81810381811115610d8457610d8461348a565b8082028115828204841417610d8457610d8461348a565b60006020828403121561352a57600080fd5b5051919050565b60ff8281168282160390811115610d8457610d8461348a565b6000808585111561355a57600080fd5b8386111561356757600080fd5b5050820193919092039150565b6001600160e01b0319813581811691600485101561359c5780818660040360031b1b83161692505b505092915050565b6000806000606084860312156135b957600080fd5b83356135c481612a4b565b925060208401359150604084013567ffffffffffffffff8111156135e757600080fd5b61308386828701612c95565b6000808335601e1984360301811261360a57600080fd5b830160208101925035905067ffffffffffffffff81111561362a57600080fd5b8036038213156128fa57600080fd5b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b604081526136836040820161367685612a60565b6001600160a01b03169052565b60208301356060820152600061369c60408501856135f3565b6101608060808601526136b46101a086018385613639565b92506136c360608801886135f3565b9250603f19808786030160a08801526136dd858584613639565b9450608089013560c088015260a089013560e0880152610100935060c089013584880152610120915060e089013582880152610140848a013581890152613726838b018b6135f3565b9550925081888703018489015261373e868685613639565b955061374c818b018b6135f3565b955093505080878603016101808801525050613769838383613639565b93505050508260208301529392505050565b6000825161378d818460208701612e62565b9190910192915050565b604081016137a582856133a4565b826020830152939250505056fea26469706673582212206d38de10695d463253620f7bec76e681851e44f22392d864735b57ecaf843b1d64736f6c63430008110033", - "deployedBytecode": "0x6080604052600436106102a05760003560e01c80638da5cb5b1161016e578063c399ec88116100cb578063f08a03231161007f578063f698da2511610064578063f698da251461088e578063fc7d3d79146108f7578063ffa1ad741461090a5761031c565b8063f08a03231461084e578063f09a40161461086e5761031c565b8063cc2f8452116100b0578063cc2f8452146107e0578063e009cfde1461080e578063ed516d511461082e5761031c565b8063c399ec88146107ab578063c4ca3a9c146107c05761031c565b8063aaf10f4211610122578063ac85dca711610107578063ac85dca714610743578063affed0e014610763578063b0d691fe146107785761031c565b8063aaf10f421461070f578063abc1b745146107235761031c565b80639e5d4c49116101535780639e5d4c49146106af578063a18f51e5146106cf578063a9059cbb146106ef5761031c565b80638da5cb5b1461066f578063912ccaa31461068f5761031c565b80633a871cdd1161021c5780635229073f116101d0578063610b5925116101b5578063610b5925146105f45780637455ce3c14610614578063856dfd99146106275761031c565b80635229073f146105995780635c0ba299146105c75761031c565b8063468721a711610201578063468721a71461055e5780634a58db191461057e5780634d44560d146105865761031c565b80633a871cdd146105115780633d46b819146105315761031c565b806313af4035116102735780631626ba7e116102585780631626ba7e146104855780632d9ad53d146104be5780633408e470146104de5761031c565b806313af40351461042a578063141a468c1461044a5761031c565b80610772146103825780618f2d146103a457806301ffc9a7146103c4578063025b22bc1461040a5761031c565b3661031c576001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001630036102ee57604051633c97166560e21b815260040160405180910390fd5b604051349033907ed05ab44e279ac59e855cb75dc2ae23b200ad994797b6f1f028f96a46ecce0290600090a3005b34801561032857600080fd5b507f6c9a6c4a39284e37ed1cf53d337577d14212a4870fb976a4366c693b939918d480548061035357005b36600080373360601b365260008060143601600080855af190503d6000803e8061037c573d6000fd5b503d6000f35b34801561038e57600080fd5b506103a261039d366004612ab2565b610953565b005b3480156103b057600080fd5b506103a26103bf366004612b53565b6109a2565b3480156103d057600080fd5b506103f56103df366004612c03565b6001600160e01b0319166301ffc9a760e01b1490565b60405190151581526020015b60405180910390f35b34801561041657600080fd5b506103a2610425366004612c20565b610ab3565b34801561043657600080fd5b506103a2610445366004612c20565b610bbb565b34801561045657600080fd5b50610477610465366004612c3d565b60336020526000908152604090205481565b604051908152602001610401565b34801561049157600080fd5b506104a56104a0366004612d22565b610cbd565b6040516001600160e01b03199091168152602001610401565b3480156104ca57600080fd5b506103f56104d9366004612c20565b610d8a565b3480156104ea57600080fd5b507f0000000000000000000000000000000000000000000000000000000000000000610477565b34801561051d57600080fd5b5061047761052c366004612d69565b610dc2565b34801561053d57600080fd5b5061047761054c366004612c3d565b60009081526033602052604090205490565b34801561056a57600080fd5b506103f5610579366004612dcc565b610e2b565b6103a2610f2a565b6103a2610594366004612e36565b610faa565b3480156105a557600080fd5b506105b96105b4366004612dcc565b611060565b604051610401929190612eb2565b3480156105d357600080fd5b506105e76105e2366004612fad565b611096565b6040516104019190613005565b34801561060057600080fd5b506103a261060f366004612c20565b6111f0565b6103f5610622366004613018565b611316565b34801561063357600080fd5b507f6c9a6c4a39284e37ed1cf53d337577d14212a4870fb976a4366c693b939918d4545b6040516001600160a01b039091168152602001610401565b34801561067b57600080fd5b50603254610657906001600160a01b031681565b34801561069b57600080fd5b506103a26106aa366004612b53565b611554565b3480156106bb57600080fd5b506103a26106ca366004612ab2565b611562565b3480156106db57600080fd5b506104776106ea36600461308d565b61156e565b3480156106fb57600080fd5b506103a261070a366004612e36565b611707565b34801561071b57600080fd5b503054610657565b34801561072f57600080fd5b5061047761073e3660046130eb565b6117a5565b34801561074f57600080fd5b506103a261075e3660046131b3565b611878565b34801561076f57600080fd5b5061047761190e565b34801561078457600080fd5b507f0000000000000000000000000000000000000000000000000000000000000000610657565b3480156107b757600080fd5b506104776119a6565b3480156107cc57600080fd5b506104776107db3660046131f4565b6119f5565b3480156107ec57600080fd5b506108006107fb366004612e36565b611a6e565b604051610401929190613265565b34801561081a57600080fd5b506103a26108293660046132c2565b611b67565b34801561083a57600080fd5b506103a2610849366004612d22565b611c99565b34801561085a57600080fd5b506103a2610869366004612c20565b611f2b565b34801561087a57600080fd5b506103a26108893660046132c2565b611fa2565b34801561089a57600080fd5b50610477604080517f47e79534a245952e8b16893a336b85a3d9ea9fa8c573f3d803afb92a794692186020820152469181019190915230606082015260009060800160405160208183030381529060405280519060200120905090565b6103f5610905366004613018565b612037565b34801561091657600080fd5b506105e76040518060400160405280600581526020017f312e302e3000000000000000000000000000000000000000000000000000000081525081565b61095b612044565b61099c848484848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506120aa92505050565b50505050565b6109aa612044565b8415806109b75750848314155b806109c25750828114155b156109f657604051630a0c0a9160e31b81526004810186905260248101849052604481018290526064015b60405180910390fd5b60005b85811015610aaa57610aa2878783818110610a1657610a166132fb565b9050602002016020810190610a2b9190612c20565b868684818110610a3d57610a3d6132fb565b90506020020135858585818110610a5657610a566132fb565b9050602002810190610a689190613311565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506120aa92505050565b6001016109f9565b50505050505050565b6032546001600160a01b03163314801590610ace5750333014155b15610aee576040516308a0b0a560e11b81523360048201526024016109ed565b6001600160a01b038116610b445760405162461bcd60e51b815260206004820152601660248201527f416464726573732063616e6e6f74206265207a65726f0000000000000000000060448201526064016109ed565b6001600160a01b0381163b610b7757604051630c76093760e01b81526001600160a01b03821660048201526024016109ed565b308054908290556040516001600160a01b0380841691908316907faa3f731066a578e5f39b4215468d826cdd15373cbc0dfc9cb9bdc649718ef7da90600090a35050565b6032546001600160a01b03163314801590610bd65750333014155b15610bf6576040516308a0b0a560e11b81523360048201526024016109ed565b6001600160a01b038116610c1d57604051639b15e16f60e01b815260040160405180910390fd5b306001600160a01b03821603610c46576040516375b4d24760e01b815260040160405180910390fd5b6032546001600160a01b0390811690821603610c7557604051638a95d3fb60e01b815260040160405180910390fd5b60328054908290556040516001600160a01b0391821691831690829030907ff2c2b1b5312b1e31ad49a7d85acd6322ae6facc51488810b882ecdb4df861cd490600090a45050565b6032546000906001600160a01b03163b15610d4c57603254604051630b135d3f60e11b81526001600160a01b0390911690631626ba7e90610d049086908690600401613358565b602060405180830381865afa158015610d21573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d459190613371565b9050610d84565b610d5683836120c8565b6032546001600160a01b03918216911603610d795750630b135d3f60e11b610d84565b506001600160e01b03195b92915050565b600060016001600160a01b03831614801590610d845750506001600160a01b0390811660009081526020819052604090205416151590565b6000336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610e0f57604051635dac3db760e11b81523360048201526024016109ed565b610e1984846120ec565b9050610e24826122dd565b9392505050565b60003360011480610e525750336000908152602081905260409020546001600160a01b0316155b15610e72576040516321ac7c5f60e01b81523360048201526024016109ed565b610e7f858585855a612328565b90508015610ef6577f8c014e41cffd68ba64f3e7830b8b2e4ee860509d8deab25ebbcbba2f0405e2da3386868686604051610ebe9594939291906133c6565b60405180910390a160405133907f6895c13664aa4f67288b25d7a21d7aaa34916e355fb9b6fae0a139a9085becb890600090a2610f22565b60405133907facd2c8702804128fdb0db2bb49f6d127dd0181c13fd45dbfe16de0930e2bd37590600090a25b949350505050565b7f000000000000000000000000000000000000000000000000000000000000000060405163b760faf960e01b81523060048201526001600160a01b03919091169063b760faf99034906024016000604051808303818588803b158015610f8f57600080fd5b505af1158015610fa3573d6000803e3d6000fd5b5050505050565b6032546001600160a01b03163314610fd75760405163d4ed9a1760e01b81523360048201526024016109ed565b7f000000000000000000000000000000000000000000000000000000000000000060405163040b850f60e31b81526001600160a01b03848116600483015260248201849052919091169063205c287890604401600060405180830381600087803b15801561104457600080fd5b505af1158015611058573d6000803e3d6000fd5b505050505050565b6000606061107086868686610e2b565b915060405160203d0181016040523d81523d6000602083013e8091505094509492505050565b606060007fda033865d68bf4a40a5a7cb4159a99e33dba8569e65ea3e38222eb12d9e66eee60001b856000015186604001518760600151805190602001208860200151896080015189600001518a602001518b604001518c606001518d608001518d6040516020016111139c9b9a99989796959493929190613411565b60408051601f1981840301815291905280516020909101209050601960f81b600160f81b611193604080517f47e79534a245952e8b16893a336b85a3d9ea9fa8c573f3d803afb92a794692186020820152469181019190915230606082015260009060800160405160208183030381529060405280519060200120905090565b6040517fff0000000000000000000000000000000000000000000000000000000000000093841660208201529290911660218301526022820152604281018290526062016040516020818303038152906040529150509392505050565b6111f861242f565b6001600160a01b038116158061121757506001600160a01b0381166001145b156112405760405163cadb248f60e01b81526001600160a01b03821660048201526024016109ed565b6001600160a01b0381811660009081526020819052604090205416156112845760405163b29d459560e01b81526001600160a01b03821660048201526024016109ed565b600060208181527fada5013122d395ba3c54772283fb069b10426056ef8ca54750cb9bb552a59e7d80546001600160a01b0385811680865260408087208054939094166001600160a01b03199384161790935560019095528254168417909155519182527fecdf3a3effea5783a3c4c2140e677577666428d44ed9d474a0b3a4c9943f8440910160405180910390a150565b600060026031540361133b57604051637465d9d160e01b815260040160405180910390fd5b600260315560005a6001600090815260336020527f10f6f77027d502f219862b0303542eb5dd005b06fa23ff4d1775aaa45bbf94778054929350909182916113959189918991908561138c836134a0565b91905055611096565b80516020820120925090506113aa8286611c99565b506113d9603f60068860800151901b6113c391906134b9565b60808801516113d4906109c46134db565b612451565b6113e5906101f46134db565b5a1015611444575a611416603f60068960800151901b61140591906134b9565b60808901516113d4906109c46134db565b611422906101f46134db565b604051633b4daac960e01b8152600481019290925260248201526044016109ed565b61148486600001518760400151886060015189602001518960200151600014611471578a60800151612328565b6109c45a61147f91906134ee565b612328565b92508215801561149657506080860151155b80156114a457506020850151155b156114dd5760808601516020860151604051631061f87f60e31b81526004810192909252602482015283151560448201526064016109ed565b60008560200151600014611545576115145a6114f990856134ee565b8751602089015160408a015160608b015160808c0151612467565b905080827f3fd74c38c9f1b6f0499c6d0128fbf77a796dbacc7eda0369b13006dc977bb56b60405160405180910390a35b50506001603155509392505050565b6110588686868686866109a2565b61099c84848484610953565b6000836000036115c05760405162461bcd60e51b815260206004820152601b60248201527f696e76616c696420746f6b656e4761735072696365466163746f72000000000060448201526064016109ed565b60005a905060006001600160a01b038416156115dc57836115de565b325b90506001600160a01b0385166116615760003a88106115fd573a6115ff565b875b6116098a8c6134db565b6116139190613501565b9050600080600080600085875af190508061165a5760405163190eecf360e31b8152600060048201526001600160a01b0384166024820152604481018390526064016109ed565b50506116c9565b6000868861166f8b8d6134db565b6116799190613501565b61168391906134b9565b9050611690868383612592565b6116c75760405163190eecf360e31b81526001600160a01b03808816600483015283166024820152604481018290526064016109ed565b505b5a82039250826040516020016116e191815260200190565b60408051601f198184030181529082905262461bcd60e51b82526109ed91600401613005565b6032546001600160a01b031633146117345760405163d4ed9a1760e01b81523360048201526024016109ed565b6001600160a01b03821661175b576040516309293b1960e41b815260040160405180910390fd5b600080600080600085875af19050806117a05760405163190eecf360e31b8152600060048201526001600160a01b0384166024820152604481018390526064016109ed565b505050565b6000806040518060a001604052808f6001600160a01b031681526020018b60018111156117d4576117d461338e565b81526020018e81526020018d8d8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050509082525060209081018b90526040805160a0810182528b81529182018a905281018890526001600160a01b0380881660608301528616608082015290915061185d828286611096565b80519060200120925050509c9b505050505050505050505050565b6032546001600160a01b031633146118a55760405163d4ed9a1760e01b81523360048201526024016109ed565b6001600160a01b0382166118cc576040516309293b1960e41b815260040160405180910390fd5b6118d7838383612592565b6117a05760405163190eecf360e31b81526001600160a01b03808516600483015283166024820152604481018290526064016109ed565b604051631aab3f0d60e11b8152306004820152600060248201819052906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906335567e1a906044015b602060405180830381865afa15801561197d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119a19190613518565b905090565b6040516370a0823160e01b81523060048201526000906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401611960565b6000805a9050611a3e878787878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525089925050505a612328565b611a5b57604051632b3f6d1160e21b815260040160405180910390fd5b5a604080519183036020830152016116e1565b606060008267ffffffffffffffff811115611a8b57611a8b612c56565b604051908082528060200260200182016040528015611ab4578160200160208202803683370190505b506001600160a01b0380861660009081526020819052604081205492945091165b6001600160a01b03811615801590611af757506001600160a01b038116600114155b8015611b0257508482105b15611b595780848381518110611b1a57611b1a6132fb565b6001600160a01b039283166020918202929092018101919091529181166000908152918290526040909120541681611b51816134a0565b925050611ad5565b908352919491935090915050565b611b6f61242f565b6001600160a01b0381161580611b8e57506001600160a01b0381166001145b15611bb75760405163cadb248f60e01b81526001600160a01b03821660048201526024016109ed565b6001600160a01b03828116600090815260208190526040902054811690821614611c1f576001600160a01b0382811660008181526020819052604090819020549051633103525b60e21b815284841660048201529216602483015260448201526064016109ed565b6001600160a01b03818116600081815260208181526040808320805488871685528285208054919097166001600160a01b03199182161790965592849052825490941690915591519081527faab4fa2b463f581b2b32cb3b7e3b704b9ce37cc209b5fb4d77e593ace4054276910160405180910390a15050565b604181511015611ceb5760405162461bcd60e51b815260206004820152601960248201527f496e76616c6964207369676e617475726573206c656e6774680000000000000060448201526064016109ed565b600080600080611d0e856020810151604082015160419092015160ff1692909190565b9195509350915060ff8416600003611e535750816041821015611d55576040516338a245ff60e11b81526004810183905260006024820181905260448201526064016109ed565b6020828601810151865190918290611d6e9086906134db565b611d7891906134db565b1115611dab5785516040516338a245ff60e11b8152600481018590526024810183905260448101919091526064016109ed565b604051630b135d3f60e11b808252878501602001916001600160a01b03851690631626ba7e90611de1908c908690600401613358565b602060405180830381865afa158015611dfe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e229190613371565b6001600160e01b03191614611e4c578060405163605d348960e01b81526004016109ed9190613005565b5050611ee6565b601e8460ff161115611ed657611ece611e6d600486613531565b8484611ec68a6040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b9291906126e3565b509050611ee6565b611ee2868585856126e3565b5090505b6032546001600160a01b03828116911614611058576032546040516310b5d43760e21b81526001600160a01b03808416600483015290911660248201526044016109ed565b611f3361242f565b7f6c9a6c4a39284e37ed1cf53d337577d14212a4870fb976a4366c693b939918d454611f5e826127a7565b816001600160a01b0316816001600160a01b03167f06be9a1bea257286cf2afa8205ed494ca9d6a4b41aa58d04238deebada20fb0c60405160405180910390a35050565b6032546001600160a01b031615611fce576040516393360fbf60e01b81523060048201526024016109ed565b6001600160a01b038216611ff557604051639b15e16f60e01b815260040160405180910390fd5b603280546001600160a01b0319166001600160a01b038416179055612019816127a7565b6120336000604051806020016040528060008152506127f2565b5050565b6000610f22848484611316565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161480159061208857506032546001600160a01b03163314155b156120a8576040516332dbd3c760e11b81523360048201526024016109ed565b565b60008082516020840185875af16040513d6000823e81610fa3573d81fd5b60008060006120d785856128bc565b915091506120e481612901565b509392505050565b600036816120fd6060860186613311565b90925090508015612204576000612117600482848661354a565b61212091613574565b90506361a2b3b760e01b6001600160e01b0319821601612202576000808061214b856004818961354a565b81019061215891906135a4565b6001600160a01b03808416600090815260208190526040902054939650919450925016156121fe57604051631179c1f560e11b81526001600160a01b038416906322f383ea906121ae908c908c90600401613662565b6020604051808303816000875af11580156121cd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121f19190613518565b9650505050505050610d84565b5050505b505b600061225d856040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b90506122ad612270610140880188613311565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525085939250506120c89050565b6032546001600160a01b039081169116146122ce5760019350505050610d84565b50600095945050505050565b50565b80156122da5760405133906000199083906000818181858888f193505050503d806000811461099c576040519150601f19603f3d011682016040523d82523d6000602084013e61099c565b6000600183600181111561233e5761233e61338e565b03612356576000808551602087018986f49050612366565b600080855160208701888a87f190505b80156123cb578360405161237a919061377b565b604051809103902085876001600160a01b03167f81d12fffced46c214dfae8ab8fa0b9f7b69f70c9d500e33f612f2105deb261ee86866040516123be929190613797565b60405180910390a4612426565b836040516123d9919061377b565b604051809103902085876001600160a01b03167f3ddd038f78c876172d5dbfd730b14c9f8692dfa197ef104eaac6df3f85a0874a868660405161241d929190613797565b60405180910390a45b95945050505050565b3330146120a8576040516301478e3360e21b81523360048201526024016109ed565b60008183116124605781610e24565b5090919050565b60008360000361248a5760405163653f35a360e01b815260040160405180910390fd5b60006001600160a01b038316156124a157826124a3565b325b90506001600160a01b038416612523573a86106124c0573a6124c2565b855b6124cc888a6134db565b6124d69190613501565b9150600080600080600086865af190508061251d5760405163190eecf360e31b8152600060048201526001600160a01b0383166024820152604481018490526064016109ed565b50612587565b848661252f898b6134db565b6125399190613501565b61254391906134b9565b9150612550848284612592565b6125875760405163190eecf360e31b81526001600160a01b03808616600483015282166024820152604481018390526064016109ed565b509695505050505050565b60006001600160a01b0384166125ea5760405162461bcd60e51b815260206004820152601d60248201527f746f6b656e2063616e206e6f74206265207a65726f206164647265737300000060448201526064016109ed565b6000846001600160a01b03163b116126445760405162461bcd60e51b815260206004820152601c60248201527f746f6b656e20636f6e747261637420646f65736e27742065786973740000000060448201526064016109ed565b604080516001600160a01b03851660248201526044808201859052825180830390910181526064909101909152602080820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1663a9059cbb60e01b178152825160009182896127105a03f13d80156126c657602081146126ce57600093506126d9565b8193506126d9565b600051158215171593505b5050509392505050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561271a575060009050600361279e565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa15801561276e573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166127975760006001925092505061279e565b9150600090505b94509492505050565b6001600160a01b0381166127ce5760405163dd449f5f60e01b815260040160405180910390fd5b7f6c9a6c4a39284e37ed1cf53d337577d14212a4870fb976a4366c693b939918d455565b600160009081526020527fada5013122d395ba3c54772283fb069b10426056ef8ca54750cb9bb552a59e7d546001600160a01b0316156128455760405163df8cc4e360e01b815260040160405180910390fd5b600160008181526020527fada5013122d395ba3c54772283fb069b10426056ef8ca54750cb9bb552a59e7d80546001600160a01b03191690911790556001600160a01b038216156120335761289f8260008360015a612328565b6120335760405163032e3a3960e51b815260040160405180910390fd5b60008082516041036128f25760208301516040840151606085015160001a6128e6878285856126e3565b945094505050506128fa565b506000905060025b9250929050565b60008160048111156129155761291561338e565b0361291d5750565b60018160048111156129315761293161338e565b0361297e5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e6174757265000000000000000060448201526064016109ed565b60028160048111156129925761299261338e565b036129df5760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e6774680060448201526064016109ed565b60038160048111156129f3576129f361338e565b036122da5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b60648201526084016109ed565b6001600160a01b03811681146122da57600080fd5b8035612a6b81612a4b565b919050565b60008083601f840112612a8257600080fd5b50813567ffffffffffffffff811115612a9a57600080fd5b6020830191508360208285010111156128fa57600080fd5b60008060008060608587031215612ac857600080fd5b8435612ad381612a4b565b935060208501359250604085013567ffffffffffffffff811115612af657600080fd5b612b0287828801612a70565b95989497509550505050565b60008083601f840112612b2057600080fd5b50813567ffffffffffffffff811115612b3857600080fd5b6020830191508360208260051b85010111156128fa57600080fd5b60008060008060008060608789031215612b6c57600080fd5b863567ffffffffffffffff80821115612b8457600080fd5b612b908a838b01612b0e565b90985096506020890135915080821115612ba957600080fd5b612bb58a838b01612b0e565b90965094506040890135915080821115612bce57600080fd5b50612bdb89828a01612b0e565b979a9699509497509295939492505050565b6001600160e01b0319811681146122da57600080fd5b600060208284031215612c1557600080fd5b8135610e2481612bed565b600060208284031215612c3257600080fd5b8135610e2481612a4b565b600060208284031215612c4f57600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b60405160a0810167ffffffffffffffff81118282101715612c8f57612c8f612c56565b60405290565b600082601f830112612ca657600080fd5b813567ffffffffffffffff80821115612cc157612cc1612c56565b604051601f8301601f19908116603f01168101908282118183101715612ce957612ce9612c56565b81604052838152866020858801011115612d0257600080fd5b836020870160208301376000602085830101528094505050505092915050565b60008060408385031215612d3557600080fd5b82359150602083013567ffffffffffffffff811115612d5357600080fd5b612d5f85828601612c95565b9150509250929050565b600080600060608486031215612d7e57600080fd5b833567ffffffffffffffff811115612d9557600080fd5b84016101608187031215612da857600080fd5b95602085013595506040909401359392505050565b803560028110612a6b57600080fd5b60008060008060808587031215612de257600080fd5b8435612ded81612a4b565b935060208501359250604085013567ffffffffffffffff811115612e1057600080fd5b612e1c87828801612c95565b925050612e2b60608601612dbd565b905092959194509250565b60008060408385031215612e4957600080fd5b8235612e5481612a4b565b946020939093013593505050565b60005b83811015612e7d578181015183820152602001612e65565b50506000910152565b60008151808452612e9e816020860160208601612e62565b601f01601f19169290920160200192915050565b8215158152604060208201526000610f226040830184612e86565b600060a08284031215612edf57600080fd5b612ee7612c6c565b90508135612ef481612a4b565b8152612f0260208301612dbd565b602082015260408201356040820152606082013567ffffffffffffffff811115612f2b57600080fd5b612f3784828501612c95565b6060830152506080820135608082015292915050565b600060a08284031215612f5f57600080fd5b612f67612c6c565b90508135815260208201356020820152604082013560408201526060820135612f8f81612a4b565b60608201526080820135612fa281612a4b565b608082015292915050565b600080600060e08486031215612fc257600080fd5b833567ffffffffffffffff811115612fd957600080fd5b612fe586828701612ecd565b935050612ff58560208601612f4d565b915060c084013590509250925092565b602081526000610e246020830184612e86565b600080600060e0848603121561302d57600080fd5b833567ffffffffffffffff8082111561304557600080fd5b61305187838801612ecd565b94506130608760208801612f4d565b935060c086013591508082111561307657600080fd5b5061308386828701612c95565b9150509250925092565b60008060008060008060c087890312156130a657600080fd5b8635955060208701359450604087013593506060870135925060808701356130cd81612a4b565b915060a08701356130dd81612a4b565b809150509295509295509295565b6000806000806000806000806000806000806101608d8f03121561310e57600080fd5b6131188d35612a4b565b8c359b5060208d01359a5067ffffffffffffffff60408e0135111561313c57600080fd5b61314c8e60408f01358f01612a70565b909a50985061315d60608e01612dbd565b975060808d0135965060a08d0135955060c08d0135945060e08d013593506101008d013561318a81612a4b565b92506131996101208e01612a60565b91506101408d013590509295989b509295989b509295989b565b6000806000606084860312156131c857600080fd5b83356131d381612a4b565b925060208401356131e381612a4b565b929592945050506040919091013590565b60008060008060006080868803121561320c57600080fd5b853561321781612a4b565b945060208601359350604086013567ffffffffffffffff81111561323a57600080fd5b61324688828901612a70565b9094509250613259905060608701612dbd565b90509295509295909350565b604080825283519082018190526000906020906060840190828701845b828110156132a75781516001600160a01b031684529284019290840190600101613282565b5050506001600160a01b039490941692019190915250919050565b600080604083850312156132d557600080fd5b82356132e081612a4b565b915060208301356132f081612a4b565b809150509250929050565b634e487b7160e01b600052603260045260246000fd5b6000808335601e1984360301811261332857600080fd5b83018035915067ffffffffffffffff82111561334357600080fd5b6020019150368190038213156128fa57600080fd5b828152604060208201526000610f226040830184612e86565b60006020828403121561338357600080fd5b8151610e2481612bed565b634e487b7160e01b600052602160045260246000fd5b600281106133c257634e487b7160e01b600052602160045260246000fd5b9052565b60006001600160a01b03808816835280871660208401525084604083015260a060608301526133f860a0830185612e86565b905061340760808301846133a4565b9695505050505050565b6000610180820190508d82526001600160a01b03808e1660208401528c60408401528b6060840152613446608084018c6133a4565b8960a08401528860c08401528760e08401528661010084015280861661012084015280851661014084015250826101608301529d9c50505050505050505050505050565b634e487b7160e01b600052601160045260246000fd5b6000600182016134b2576134b261348a565b5060010190565b6000826134d657634e487b7160e01b600052601260045260246000fd5b500490565b80820180821115610d8457610d8461348a565b81810381811115610d8457610d8461348a565b8082028115828204841417610d8457610d8461348a565b60006020828403121561352a57600080fd5b5051919050565b60ff8281168282160390811115610d8457610d8461348a565b6000808585111561355a57600080fd5b8386111561356757600080fd5b5050820193919092039150565b6001600160e01b0319813581811691600485101561359c5780818660040360031b1b83161692505b505092915050565b6000806000606084860312156135b957600080fd5b83356135c481612a4b565b925060208401359150604084013567ffffffffffffffff8111156135e757600080fd5b61308386828701612c95565b6000808335601e1984360301811261360a57600080fd5b830160208101925035905067ffffffffffffffff81111561362a57600080fd5b8036038213156128fa57600080fd5b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b604081526136836040820161367685612a60565b6001600160a01b03169052565b60208301356060820152600061369c60408501856135f3565b6101608060808601526136b46101a086018385613639565b92506136c360608801886135f3565b9250603f19808786030160a08801526136dd858584613639565b9450608089013560c088015260a089013560e0880152610100935060c089013584880152610120915060e089013582880152610140848a013581890152613726838b018b6135f3565b9550925081888703018489015261373e868685613639565b955061374c818b018b6135f3565b955093505080878603016101808801525050613769838383613639565b93505050508260208301529392505050565b6000825161378d818460208701612e62565b9190910192915050565b604081016137a582856133a4565b826020830152939250505056fea26469706673582212206d38de10695d463253620f7bec76e681851e44f22392d864735b57ecaf843b1d64736f6c63430008110033", - "linkReferences": {}, - "deployedLinkReferences": {} -} diff --git a/packages/common/abis/biconomy_v2.0.0/ECDSAOwnershipRegistryModule_v1.0.0.json b/packages/common/abis/biconomy_v2.0.0/ECDSAOwnershipRegistryModule_v1.0.0.json deleted file mode 100644 index 454215192..000000000 --- a/packages/common/abis/biconomy_v2.0.0/ECDSAOwnershipRegistryModule_v1.0.0.json +++ /dev/null @@ -1,298 +0,0 @@ -{ - "_format": "hh-sol-artifact-1", - "contractName": "EcdsaOwnershipRegistryModule", - "sourceName": "contracts/smart-account/modules/EcdsaOwnershipRegistryModule.sol", - "abi": [ - { - "inputs": [ - { - "internalType": "address", - "name": "smartAccount", - "type": "address" - } - ], - "name": "AlreadyInitedForSmartAccount", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "smartAccount", - "type": "address" - } - ], - "name": "NoOwnerRegisteredForSmartAccount", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "account", - "type": "address" - } - ], - "name": "NotEOA", - "type": "error" - }, - { - "inputs": [], - "name": "WrongSignatureLength", - "type": "error" - }, - { - "inputs": [], - "name": "ZeroAddressNotAllowedAsOwner", - "type": "error" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "smartAccount", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "oldOwner", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "newOwner", - "type": "address" - } - ], - "name": "OwnershipTransferred", - "type": "event" - }, - { - "inputs": [], - "name": "NAME", - "outputs": [ - { - "internalType": "string", - "name": "", - "type": "string" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "VERSION", - "outputs": [ - { - "internalType": "string", - "name": "", - "type": "string" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "smartAccount", - "type": "address" - } - ], - "name": "getOwner", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "eoaOwner", - "type": "address" - } - ], - "name": "initForSmartAccount", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "dataHash", - "type": "bytes32" - }, - { - "internalType": "bytes", - "name": "moduleSignature", - "type": "bytes" - } - ], - "name": "isValidSignature", - "outputs": [ - { - "internalType": "bytes4", - "name": "", - "type": "bytes4" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "dataHash", - "type": "bytes32" - }, - { - "internalType": "bytes", - "name": "moduleSignature", - "type": "bytes" - }, - { - "internalType": "address", - "name": "smartAccount", - "type": "address" - } - ], - "name": "isValidSignatureForAddress", - "outputs": [ - { - "internalType": "bytes4", - "name": "", - "type": "bytes4" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "renounceOwnership", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "owner", - "type": "address" - } - ], - "name": "transferOwnership", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "components": [ - { - "internalType": "address", - "name": "sender", - "type": "address" - }, - { - "internalType": "uint256", - "name": "nonce", - "type": "uint256" - }, - { - "internalType": "bytes", - "name": "initCode", - "type": "bytes" - }, - { - "internalType": "bytes", - "name": "callData", - "type": "bytes" - }, - { - "internalType": "uint256", - "name": "callGasLimit", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "verificationGasLimit", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "preVerificationGas", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "maxFeePerGas", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "maxPriorityFeePerGas", - "type": "uint256" - }, - { - "internalType": "bytes", - "name": "paymasterAndData", - "type": "bytes" - }, - { - "internalType": "bytes", - "name": "signature", - "type": "bytes" - } - ], - "internalType": "struct UserOperation", - "name": "userOp", - "type": "tuple" - }, - { - "internalType": "bytes32", - "name": "userOpHash", - "type": "bytes32" - } - ], - "name": "validateUserOp", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - } - ], - "bytecode": "0x608060405234801561001057600080fd5b50610aed806100206000396000f3fe608060405234801561001057600080fd5b50600436106100a35760003560e01c8063f2fde38b11610076578063fa5441611161005b578063fa54416114610195578063ffa1ad74146101a8578063fff35b72146101e457600080fd5b8063f2fde38b1461016f578063f44c339d1461018257600080fd5b80631626ba7e146100a85780632ede3bc0146100f1578063715018a61461011c578063a3f4df7e14610126575b600080fd5b6100bb6100b636600461089b565b610205565b6040517fffffffff0000000000000000000000000000000000000000000000000000000090911681526020015b60405180910390f35b6101046100ff3660046108f7565b61021b565b6040516001600160a01b0390911681526020016100e8565b6101246102bf565b005b6101626040518060400160405280601f81526020017f4543445341204f776e657273686970205265676973747279204d6f64756c650081525081565b6040516100e89190610914565b61012461017d3660046108f7565b6102cc565b6100bb610190366004610962565b61032b565b6101046101a33660046108f7565b610375565b6101626040518060400160405280600581526020017f302e322e3000000000000000000000000000000000000000000000000000000081525081565b6101f76101f23660046109bd565b6103bb565b6040519081526020016100e8565b600061021283833361032b565b90505b92915050565b336000908152602081905260408120546001600160a01b03161561025957604051632c4dfb7d60e21b81523360048201526024015b60405180910390fd5b6001600160a01b038216610280576040516307e179e960e31b815260040160405180910390fd5b50336000908152602081905260409020805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b03929092169190911790553090565b6102ca33600061040c565b565b803b156102f7576040516377817ac360e01b81526001600160a01b0382166004820152602401610250565b6001600160a01b03811661031e576040516307e179e960e31b815260040160405180910390fd5b610328338261040c565b50565b600061033884848461047d565b1561034b5750630b135d3f60e11b61036e565b507fffffffff000000000000000000000000000000000000000000000000000000005b9392505050565b6001600160a01b038082166000908152602081905260408120549091168061021557604051633d3fff5360e21b81526001600160a01b0384166004820152602401610250565b6000806103cc610140850185610a08565b8101906103d99190610a4f565b5090506103f383826103ee60208801886108f7565b61047d565b15610402576000915050610215565b5060019392505050565b6001600160a01b03808316600081815260208190526040808220805486861673ffffffffffffffffffffffffffffffffffffffff19821681179092559151919094169392849290917fc8894f26f396ce8c004245c8b7cd1b92103a6e4302fcbab883987149ac01b7ec9190a4505050565b6001600160a01b03808216600090815260208190526040812054909116806104c357604051633d3fff5360e21b81526001600160a01b0384166004820152602401610250565b6041845110156104e657604051632bb1a9c560e11b815260040160405180910390fd5b7f19457468657265756d205369676e6564204d6573736167653a0a3332000000006000908152601c869052603c812061051f9086610581565b9050806001600160a01b0316826001600160a01b0316036105455760019250505061036e565b61054f8686610581565b9050806001600160a01b0316826001600160a01b0316036105755760019250505061036e565b50600095945050505050565b600080600061059085856105a5565b9150915061059d816105ea565b509392505050565b60008082516041036105db5760208301516040840151606085015160001a6105cf87828585610734565b945094505050506105e3565b506000905060025b9250929050565b60008160048111156105fe576105fe610aa1565b036106065750565b600181600481111561061a5761061a610aa1565b036106675760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610250565b600281600481111561067b5761067b610aa1565b036106c85760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610250565b60038160048111156106dc576106dc610aa1565b036103285760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610250565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561076b57506000905060036107ef565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa1580156107bf573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166107e8576000600192509250506107ef565b9150600090505b94509492505050565b634e487b7160e01b600052604160045260246000fd5b600082601f83011261081f57600080fd5b813567ffffffffffffffff8082111561083a5761083a6107f8565b604051601f8301601f19908116603f01168101908282118183101715610862576108626107f8565b8160405283815286602085880101111561087b57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600080604083850312156108ae57600080fd5b82359150602083013567ffffffffffffffff8111156108cc57600080fd5b6108d88582860161080e565b9150509250929050565b6001600160a01b038116811461032857600080fd5b60006020828403121561090957600080fd5b813561036e816108e2565b600060208083528351808285015260005b8181101561094157858101830151858201604001528201610925565b506000604082860101526040601f19601f8301168501019250505092915050565b60008060006060848603121561097757600080fd5b83359250602084013567ffffffffffffffff81111561099557600080fd5b6109a18682870161080e565b92505060408401356109b2816108e2565b809150509250925092565b600080604083850312156109d057600080fd5b823567ffffffffffffffff8111156109e757600080fd5b830161016081860312156109fa57600080fd5b946020939093013593505050565b6000808335601e19843603018112610a1f57600080fd5b83018035915067ffffffffffffffff821115610a3a57600080fd5b6020019150368190038213156105e357600080fd5b60008060408385031215610a6257600080fd5b823567ffffffffffffffff811115610a7957600080fd5b610a858582860161080e565b9250506020830135610a96816108e2565b809150509250929050565b634e487b7160e01b600052602160045260246000fdfea26469706673582212200f64d9f85c9789441febe939ee2ec56eca850156ea304b5eabd0856fee5e186e64736f6c63430008110033", - "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100a35760003560e01c8063f2fde38b11610076578063fa5441611161005b578063fa54416114610195578063ffa1ad74146101a8578063fff35b72146101e457600080fd5b8063f2fde38b1461016f578063f44c339d1461018257600080fd5b80631626ba7e146100a85780632ede3bc0146100f1578063715018a61461011c578063a3f4df7e14610126575b600080fd5b6100bb6100b636600461089b565b610205565b6040517fffffffff0000000000000000000000000000000000000000000000000000000090911681526020015b60405180910390f35b6101046100ff3660046108f7565b61021b565b6040516001600160a01b0390911681526020016100e8565b6101246102bf565b005b6101626040518060400160405280601f81526020017f4543445341204f776e657273686970205265676973747279204d6f64756c650081525081565b6040516100e89190610914565b61012461017d3660046108f7565b6102cc565b6100bb610190366004610962565b61032b565b6101046101a33660046108f7565b610375565b6101626040518060400160405280600581526020017f302e322e3000000000000000000000000000000000000000000000000000000081525081565b6101f76101f23660046109bd565b6103bb565b6040519081526020016100e8565b600061021283833361032b565b90505b92915050565b336000908152602081905260408120546001600160a01b03161561025957604051632c4dfb7d60e21b81523360048201526024015b60405180910390fd5b6001600160a01b038216610280576040516307e179e960e31b815260040160405180910390fd5b50336000908152602081905260409020805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b03929092169190911790553090565b6102ca33600061040c565b565b803b156102f7576040516377817ac360e01b81526001600160a01b0382166004820152602401610250565b6001600160a01b03811661031e576040516307e179e960e31b815260040160405180910390fd5b610328338261040c565b50565b600061033884848461047d565b1561034b5750630b135d3f60e11b61036e565b507fffffffff000000000000000000000000000000000000000000000000000000005b9392505050565b6001600160a01b038082166000908152602081905260408120549091168061021557604051633d3fff5360e21b81526001600160a01b0384166004820152602401610250565b6000806103cc610140850185610a08565b8101906103d99190610a4f565b5090506103f383826103ee60208801886108f7565b61047d565b15610402576000915050610215565b5060019392505050565b6001600160a01b03808316600081815260208190526040808220805486861673ffffffffffffffffffffffffffffffffffffffff19821681179092559151919094169392849290917fc8894f26f396ce8c004245c8b7cd1b92103a6e4302fcbab883987149ac01b7ec9190a4505050565b6001600160a01b03808216600090815260208190526040812054909116806104c357604051633d3fff5360e21b81526001600160a01b0384166004820152602401610250565b6041845110156104e657604051632bb1a9c560e11b815260040160405180910390fd5b7f19457468657265756d205369676e6564204d6573736167653a0a3332000000006000908152601c869052603c812061051f9086610581565b9050806001600160a01b0316826001600160a01b0316036105455760019250505061036e565b61054f8686610581565b9050806001600160a01b0316826001600160a01b0316036105755760019250505061036e565b50600095945050505050565b600080600061059085856105a5565b9150915061059d816105ea565b509392505050565b60008082516041036105db5760208301516040840151606085015160001a6105cf87828585610734565b945094505050506105e3565b506000905060025b9250929050565b60008160048111156105fe576105fe610aa1565b036106065750565b600181600481111561061a5761061a610aa1565b036106675760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610250565b600281600481111561067b5761067b610aa1565b036106c85760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610250565b60038160048111156106dc576106dc610aa1565b036103285760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610250565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561076b57506000905060036107ef565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa1580156107bf573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166107e8576000600192509250506107ef565b9150600090505b94509492505050565b634e487b7160e01b600052604160045260246000fd5b600082601f83011261081f57600080fd5b813567ffffffffffffffff8082111561083a5761083a6107f8565b604051601f8301601f19908116603f01168101908282118183101715610862576108626107f8565b8160405283815286602085880101111561087b57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600080604083850312156108ae57600080fd5b82359150602083013567ffffffffffffffff8111156108cc57600080fd5b6108d88582860161080e565b9150509250929050565b6001600160a01b038116811461032857600080fd5b60006020828403121561090957600080fd5b813561036e816108e2565b600060208083528351808285015260005b8181101561094157858101830151858201604001528201610925565b506000604082860101526040601f19601f8301168501019250505092915050565b60008060006060848603121561097757600080fd5b83359250602084013567ffffffffffffffff81111561099557600080fd5b6109a18682870161080e565b92505060408401356109b2816108e2565b809150509250925092565b600080604083850312156109d057600080fd5b823567ffffffffffffffff8111156109e757600080fd5b830161016081860312156109fa57600080fd5b946020939093013593505050565b6000808335601e19843603018112610a1f57600080fd5b83018035915067ffffffffffffffff821115610a3a57600080fd5b6020019150368190038213156105e357600080fd5b60008060408385031215610a6257600080fd5b823567ffffffffffffffff811115610a7957600080fd5b610a858582860161080e565b9250506020830135610a96816108e2565b809150509250929050565b634e487b7160e01b600052602160045260246000fdfea26469706673582212200f64d9f85c9789441febe939ee2ec56eca850156ea304b5eabd0856fee5e186e64736f6c63430008110033", - "linkReferences": {}, - "deployedLinkReferences": {} - } - \ No newline at end of file diff --git a/packages/common/abis/biconomy_v2.0.0/MultiChainValidationModule_v1.0.0.json b/packages/common/abis/biconomy_v2.0.0/MultiChainValidationModule_v1.0.0.json deleted file mode 100644 index 10709b249..000000000 --- a/packages/common/abis/biconomy_v2.0.0/MultiChainValidationModule_v1.0.0.json +++ /dev/null @@ -1,298 +0,0 @@ -{ - "_format": "hh-sol-artifact-1", - "contractName": "MultichainECDSAValidator", - "sourceName": "contracts/smart-account/modules/MultichainECDSAValidator.sol", - "abi": [ - { - "inputs": [ - { - "internalType": "address", - "name": "smartAccount", - "type": "address" - } - ], - "name": "AlreadyInitedForSmartAccount", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "smartAccount", - "type": "address" - } - ], - "name": "NoOwnerRegisteredForSmartAccount", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "account", - "type": "address" - } - ], - "name": "NotEOA", - "type": "error" - }, - { - "inputs": [], - "name": "WrongSignatureLength", - "type": "error" - }, - { - "inputs": [], - "name": "ZeroAddressNotAllowedAsOwner", - "type": "error" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "smartAccount", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "oldOwner", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "newOwner", - "type": "address" - } - ], - "name": "OwnershipTransferred", - "type": "event" - }, - { - "inputs": [], - "name": "NAME", - "outputs": [ - { - "internalType": "string", - "name": "", - "type": "string" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "VERSION", - "outputs": [ - { - "internalType": "string", - "name": "", - "type": "string" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "smartAccount", - "type": "address" - } - ], - "name": "getOwner", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "eoaOwner", - "type": "address" - } - ], - "name": "initForSmartAccount", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "dataHash", - "type": "bytes32" - }, - { - "internalType": "bytes", - "name": "moduleSignature", - "type": "bytes" - } - ], - "name": "isValidSignature", - "outputs": [ - { - "internalType": "bytes4", - "name": "", - "type": "bytes4" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "dataHash", - "type": "bytes32" - }, - { - "internalType": "bytes", - "name": "moduleSignature", - "type": "bytes" - }, - { - "internalType": "address", - "name": "smartAccount", - "type": "address" - } - ], - "name": "isValidSignatureForAddress", - "outputs": [ - { - "internalType": "bytes4", - "name": "", - "type": "bytes4" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "renounceOwnership", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "owner", - "type": "address" - } - ], - "name": "transferOwnership", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "components": [ - { - "internalType": "address", - "name": "sender", - "type": "address" - }, - { - "internalType": "uint256", - "name": "nonce", - "type": "uint256" - }, - { - "internalType": "bytes", - "name": "initCode", - "type": "bytes" - }, - { - "internalType": "bytes", - "name": "callData", - "type": "bytes" - }, - { - "internalType": "uint256", - "name": "callGasLimit", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "verificationGasLimit", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "preVerificationGas", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "maxFeePerGas", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "maxPriorityFeePerGas", - "type": "uint256" - }, - { - "internalType": "bytes", - "name": "paymasterAndData", - "type": "bytes" - }, - { - "internalType": "bytes", - "name": "signature", - "type": "bytes" - } - ], - "internalType": "struct UserOperation", - "name": "userOp", - "type": "tuple" - }, - { - "internalType": "bytes32", - "name": "userOpHash", - "type": "bytes32" - } - ], - "name": "validateUserOp", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - } - ], - "bytecode": "0x6080806040523461001657610b9b908161001c8239f35b600080fdfe6040608081526004908136101561001557600080fd5b6000803560e01c80631626ba7e1461040a5780632ede3bc014610388578063715018a614610318578063a3f4df7e146102c3578063f2fde38b1461020d578063f44c339d14610185578063fa5441611461012d578063ffa1ad74146100d45763fff35b721461008357600080fd5b346100cd576003199082823601126100cd5783359167ffffffffffffffff83116100d0576101609083360301126100cd57506020926100c691602435910161085d565b9051908152f35b80fd5b5080fd5b5090346100d057816003193601126100d0578051610129916100f58261044a565b600582527f302e322e300000000000000000000000000000000000000000000000000000006020830152519182918261053f565b0390f35b5082346100d05760203660031901126100d0576001600160a01b038381610152610506565b16938481528060205220541691821561016f576020838551908152f35b8351633d3fff5360e21b81529182015260249150fd5b5091346102095760603660031901126102095760243567ffffffffffffffff8111610205576101b790369083016104ba565b90604435936001600160a01b03851685036100cd5750926101db916020943561056b565b90517fffffffff000000000000000000000000000000000000000000000000000000009091168152f35b8380fd5b8280fd5b5091903461020957602036600319011261020957610229610506565b803b6102a4576001600160a01b0380911692831561029657503384528360205281842054169083208273ffffffffffffffffffffffffffffffffffffffff19825416179055337fc8894f26f396ce8c004245c8b7cd1b92103a6e4302fcbab883987149ac01b7ec8480a480f35b82516307e179e960e31b8152fd5b826001600160a01b0360249351926377817ac360e01b84521690820152fd5b5090346100d057816003193601126100d0578051610129916102e48261044a565b601f82527f4543445341204f776e657273686970205265676973747279204d6f64756c65006020830152519182918261053f565b50809134610385578160031936011261038557338252816020526001600160a01b03818320541690822073ffffffffffffffffffffffffffffffffffffffff198154169055337fc8894f26f396ce8c004245c8b7cd1b92103a6e4302fcbab883987149ac01b7ec8380a480f35b50fd5b509134610209576020366003190112610209576103a3610506565b338452836020526001600160a01b03908184862054166103f45716908115610296575081602093338152808552209073ffffffffffffffffffffffffffffffffffffffff1982541617905551308152f35b8351632c4dfb7d60e21b81523381850152602490fd5b50346100cd57816003193601126100cd576024359067ffffffffffffffff82116100cd57506020926104426101db92369083016104ba565b33913561056b565b6040810190811067ffffffffffffffff82111761046657604052565b634e487b7160e01b600052604160045260246000fd5b90601f8019910116810190811067ffffffffffffffff82111761046657604052565b67ffffffffffffffff811161046657601f01601f191660200190565b81601f82011215610501578035906104d18261049e565b926104df604051948561047c565b8284526020838301011161050157816000926020809301838601378301015290565b600080fd5b600435906001600160a01b038216820361050157565b60005b83811061052f5750506000910152565b818101518382015260200161051f565b6040916020825261055f815180928160208601526020868601910161051c565b601f01601f1916010190565b9061057692916105a9565b61059e577fffffffff0000000000000000000000000000000000000000000000000000000090565b630b135d3f60e11b90565b916001600160a01b0380911691600093838552846020528260408620541693841561065757506041825110610645577f19457468657265756d205369676e6564204d6573736167653a0a333200000000855280601c528261061861061084603c8920610789565b91909161066f565b16841461063b5761062c9161061091610789565b16146106355790565b50600190565b5050505050600190565b604051632bb1a9c560e11b8152600490fd5b60249060405190633d3fff5360e21b82526004820152fd5b600581101561077357806106805750565b600181036106cd5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606490fd5b6002810361071a5760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606490fd5b60031461072357565b60405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608490fd5b634e487b7160e01b600052602160045260246000fd5b9060418151146000146107b7576107b3916020820151906060604084015193015160001a906107c1565b9091565b5050600090600290565b9291907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831161083e5791608094939160ff602094604051948552168484015260408301526060820152600093849182805260015afa156108315781516001600160a01b03811615610635579190565b50604051903d90823e3d90fd5b50505050600090600390565b519065ffffffffffff8216820361050157565b919091610140810135601e19823603018112156105015781019182359267ffffffffffffffff9081851161050157602092838201958036038713610501578201604096878483031261050157359084821161050157879186806108c49301918601016104ba565b920135946001600160a01b0395868116036105015735966041835114610b43578251830160a0848783019203126105015761090086850161084a565b9061090c89860161084a565b9060608601519160808701518881116105015787019782603f8a011215610501578989015197818911610466578a998d9960059a818c1b9161095482519e8f9085019061047c565b8d528d8d019183010191868311610501578f8e9101915b838310610b33575050505060a081015190828211610501570183603f8201121561050157808b01518d9461099e8261049e565b956109ab8151978861047c565b8287528284010111610501576109c6918e8d8701910161051c565b8b51908a8201927fffffffffffff000000000000000000000000000000000000000000000000000090818860d01b16855260d01b1696876026840152602c830152602c8252606082019082821090821117610466578c52519020986000995b88518b1015610a84578a881b89018a0151908c600083831015610a7757505060005289528a6000205b996000198114610a615760010199610a25565b634e487b7160e01b600052601160045260246000fd5b91909282528b5220610a4e565b91965094999a93985081965096919603610af05750610aa8949596975016916105a9565b15610ae95779ffffffffffff00000000000000000000000000000000000000009065ffffffffffff90818116610ae257505b60a01b161790565b9050610ada565b5050600190565b60649089519062461bcd60e51b82526004820152600e60248201527f496e76616c696420557365724f700000000000000000000000000000000000006044820152fd5b82518152918101918e910161096b565b94925095909250610b56945016916105a9565b15610b6057600090565b60019056fea26469706673582212202a3242d73a2c92fd929c32924b5f964b80434c765985e101142ea4635452e6a664736f6c63430008110033", - "deployedBytecode": "0x6040608081526004908136101561001557600080fd5b6000803560e01c80631626ba7e1461040a5780632ede3bc014610388578063715018a614610318578063a3f4df7e146102c3578063f2fde38b1461020d578063f44c339d14610185578063fa5441611461012d578063ffa1ad74146100d45763fff35b721461008357600080fd5b346100cd576003199082823601126100cd5783359167ffffffffffffffff83116100d0576101609083360301126100cd57506020926100c691602435910161085d565b9051908152f35b80fd5b5080fd5b5090346100d057816003193601126100d0578051610129916100f58261044a565b600582527f302e322e300000000000000000000000000000000000000000000000000000006020830152519182918261053f565b0390f35b5082346100d05760203660031901126100d0576001600160a01b038381610152610506565b16938481528060205220541691821561016f576020838551908152f35b8351633d3fff5360e21b81529182015260249150fd5b5091346102095760603660031901126102095760243567ffffffffffffffff8111610205576101b790369083016104ba565b90604435936001600160a01b03851685036100cd5750926101db916020943561056b565b90517fffffffff000000000000000000000000000000000000000000000000000000009091168152f35b8380fd5b8280fd5b5091903461020957602036600319011261020957610229610506565b803b6102a4576001600160a01b0380911692831561029657503384528360205281842054169083208273ffffffffffffffffffffffffffffffffffffffff19825416179055337fc8894f26f396ce8c004245c8b7cd1b92103a6e4302fcbab883987149ac01b7ec8480a480f35b82516307e179e960e31b8152fd5b826001600160a01b0360249351926377817ac360e01b84521690820152fd5b5090346100d057816003193601126100d0578051610129916102e48261044a565b601f82527f4543445341204f776e657273686970205265676973747279204d6f64756c65006020830152519182918261053f565b50809134610385578160031936011261038557338252816020526001600160a01b03818320541690822073ffffffffffffffffffffffffffffffffffffffff198154169055337fc8894f26f396ce8c004245c8b7cd1b92103a6e4302fcbab883987149ac01b7ec8380a480f35b50fd5b509134610209576020366003190112610209576103a3610506565b338452836020526001600160a01b03908184862054166103f45716908115610296575081602093338152808552209073ffffffffffffffffffffffffffffffffffffffff1982541617905551308152f35b8351632c4dfb7d60e21b81523381850152602490fd5b50346100cd57816003193601126100cd576024359067ffffffffffffffff82116100cd57506020926104426101db92369083016104ba565b33913561056b565b6040810190811067ffffffffffffffff82111761046657604052565b634e487b7160e01b600052604160045260246000fd5b90601f8019910116810190811067ffffffffffffffff82111761046657604052565b67ffffffffffffffff811161046657601f01601f191660200190565b81601f82011215610501578035906104d18261049e565b926104df604051948561047c565b8284526020838301011161050157816000926020809301838601378301015290565b600080fd5b600435906001600160a01b038216820361050157565b60005b83811061052f5750506000910152565b818101518382015260200161051f565b6040916020825261055f815180928160208601526020868601910161051c565b601f01601f1916010190565b9061057692916105a9565b61059e577fffffffff0000000000000000000000000000000000000000000000000000000090565b630b135d3f60e11b90565b916001600160a01b0380911691600093838552846020528260408620541693841561065757506041825110610645577f19457468657265756d205369676e6564204d6573736167653a0a333200000000855280601c528261061861061084603c8920610789565b91909161066f565b16841461063b5761062c9161061091610789565b16146106355790565b50600190565b5050505050600190565b604051632bb1a9c560e11b8152600490fd5b60249060405190633d3fff5360e21b82526004820152fd5b600581101561077357806106805750565b600181036106cd5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606490fd5b6002810361071a5760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606490fd5b60031461072357565b60405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608490fd5b634e487b7160e01b600052602160045260246000fd5b9060418151146000146107b7576107b3916020820151906060604084015193015160001a906107c1565b9091565b5050600090600290565b9291907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831161083e5791608094939160ff602094604051948552168484015260408301526060820152600093849182805260015afa156108315781516001600160a01b03811615610635579190565b50604051903d90823e3d90fd5b50505050600090600390565b519065ffffffffffff8216820361050157565b919091610140810135601e19823603018112156105015781019182359267ffffffffffffffff9081851161050157602092838201958036038713610501578201604096878483031261050157359084821161050157879186806108c49301918601016104ba565b920135946001600160a01b0395868116036105015735966041835114610b43578251830160a0848783019203126105015761090086850161084a565b9061090c89860161084a565b9060608601519160808701518881116105015787019782603f8a011215610501578989015197818911610466578a998d9960059a818c1b9161095482519e8f9085019061047c565b8d528d8d019183010191868311610501578f8e9101915b838310610b33575050505060a081015190828211610501570183603f8201121561050157808b01518d9461099e8261049e565b956109ab8151978861047c565b8287528284010111610501576109c6918e8d8701910161051c565b8b51908a8201927fffffffffffff000000000000000000000000000000000000000000000000000090818860d01b16855260d01b1696876026840152602c830152602c8252606082019082821090821117610466578c52519020986000995b88518b1015610a84578a881b89018a0151908c600083831015610a7757505060005289528a6000205b996000198114610a615760010199610a25565b634e487b7160e01b600052601160045260246000fd5b91909282528b5220610a4e565b91965094999a93985081965096919603610af05750610aa8949596975016916105a9565b15610ae95779ffffffffffff00000000000000000000000000000000000000009065ffffffffffff90818116610ae257505b60a01b161790565b9050610ada565b5050600190565b60649089519062461bcd60e51b82526004820152600e60248201527f496e76616c696420557365724f700000000000000000000000000000000000006044820152fd5b82518152918101918e910161096b565b94925095909250610b56945016916105a9565b15610b6057600090565b60019056fea26469706673582212202a3242d73a2c92fd929c32924b5f964b80434c765985e101142ea4635452e6a664736f6c63430008110033", - "linkReferences": {}, - "deployedLinkReferences": {} - } - \ No newline at end of file diff --git a/packages/common/abis/biconomy_v2.0.0/SmartAccountFactory_v2.0.0.json b/packages/common/abis/biconomy_v2.0.0/SmartAccountFactory_v2.0.0.json deleted file mode 100644 index 317e05a87..000000000 --- a/packages/common/abis/biconomy_v2.0.0/SmartAccountFactory_v2.0.0.json +++ /dev/null @@ -1,293 +0,0 @@ -{ - "_format": "hh-sol-artifact-1", - "contractName": "SmartAccountFactory", - "sourceName": "contracts/smart-account/factory/SmartAccountFactory.sol", - "abi": [ - { - "inputs": [ - { - "internalType": "address", - "name": "_basicImplementation", - "type": "address" - }, - { - "internalType": "address", - "name": "_newOwner", - "type": "address" - } - ], - "stateMutability": "nonpayable", - "type": "constructor" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "account", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "initialAuthModule", - "type": "address" - }, - { - "indexed": true, - "internalType": "uint256", - "name": "index", - "type": "uint256" - } - ], - "name": "AccountCreation", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "account", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "initialAuthModule", - "type": "address" - } - ], - "name": "AccountCreationWithoutIndex", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "previousOwner", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "newOwner", - "type": "address" - } - ], - "name": "OwnershipTransferred", - "type": "event" - }, - { - "inputs": [], - "name": "accountCreationCode", - "outputs": [ - { - "internalType": "bytes", - "name": "", - "type": "bytes" - } - ], - "stateMutability": "pure", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "epAddress", - "type": "address" - }, - { - "internalType": "uint32", - "name": "unstakeDelaySec", - "type": "uint32" - } - ], - "name": "addStake", - "outputs": [], - "stateMutability": "payable", - "type": "function" - }, - { - "inputs": [], - "name": "basicImplementation", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "moduleSetupContract", - "type": "address" - }, - { - "internalType": "bytes", - "name": "moduleSetupData", - "type": "bytes" - } - ], - "name": "deployAccount", - "outputs": [ - { - "internalType": "address", - "name": "proxy", - "type": "address" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "moduleSetupContract", - "type": "address" - }, - { - "internalType": "bytes", - "name": "moduleSetupData", - "type": "bytes" - }, - { - "internalType": "uint256", - "name": "index", - "type": "uint256" - } - ], - "name": "deployCounterFactualAccount", - "outputs": [ - { - "internalType": "address", - "name": "proxy", - "type": "address" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "moduleSetupContract", - "type": "address" - }, - { - "internalType": "bytes", - "name": "moduleSetupData", - "type": "bytes" - }, - { - "internalType": "uint256", - "name": "index", - "type": "uint256" - } - ], - "name": "getAddressForCounterFactualAccount", - "outputs": [ - { - "internalType": "address", - "name": "_account", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "minimalHandler", - "outputs": [ - { - "internalType": "contract DefaultCallbackHandler", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "owner", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "renounceOwnership", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "newOwner", - "type": "address" - } - ], - "name": "transferOwnership", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "epAddress", - "type": "address" - } - ], - "name": "unlockStake", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "epAddress", - "type": "address" - }, - { - "internalType": "address payable", - "name": "withdrawAddress", - "type": "address" - } - ], - "name": "withdrawStake", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - } - ], - "bytecode": "0x60c0346101445761171b906001600160401b0390601f38849003908101601f1916820190838211838310176100ea57808391604096879485528339810103126101445761006861005a602061005384610149565b9301610149565b6100633361015d565b61015d565b6001600160a01b03811615610100576080528151906104e690818301908111838210176100ea578291611235833903906000f080156100df5760a0525161109090816101a582396080518181816101ed015281816105a70152818161074601526107ef015260a05181818161039e0152610b7c0152f35b50513d6000823e3d90fd5b634e487b7160e01b600052604160045260246000fd5b825162461bcd60e51b815260206004820152601d60248201527f696d706c656d656e746174696f6e2063616e6e6f74206265207a65726f0000006044820152606490fd5b600080fd5b51906001600160a01b038216820361014457565b600080546001600160a01b039283166001600160a01b03198216811783559216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09080a356fe60806040526004361015610013575b600080fd5b60003560e01c80632e7a1a831461010357806331c884df146100fa5780633b3cb143146100f157806345171159146100e85780634a1ce599146100df578063715018a6146100d6578063743b1e03146100cd5780638da5cb5b146100c4578063b36f9705146100bb578063daf0dfc8146100b2578063df20ffbc146100a95763f2fde38b146100a157600080fd5b61000e6108a6565b5061000e61076a565b5061000e610725565b5061000e6106a1565b5061000e610679565b5061000e610533565b5061000e6104cb565b5061000e61045f565b5061000e6103c2565b5061000e61037d565b5061000e61031d565b5061000e61018c565b6001600160a01b0381160361000e57565b9181601f8401121561000e5782359167ffffffffffffffff831161000e576020838186019501011161000e57565b90606060031983011261000e576004356101648161010c565b916024359067ffffffffffffffff821161000e576101849160040161011d565b909160443590565b503461000e576102f66102dc6102d06101b16101a73661014b565b9392919091610b54565b6102c1610120916020926101c6848201610a8e565b90808252610bdb858301396040519461024a61025687610214888201956001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169087610a9e565b0394610228601f19968781018b528a610a5f565b8781519101209260405192839189830195869091604092825260208201520190565b03858101835282610a5f565b519020945190206040517fff000000000000000000000000000000000000000000000000000000000000009481019485523060601b6bffffffffffffffffffffffff191660018601526015850195909552603584015291929182605585015b03908101835282610a5f565b5190206001600160a01b031690565b6001600160a01b031690565b6040516001600160a01b0390911681529081906020820190565b0390f35b60005b83811061030d5750506000910152565b81810151838201526020016102fd565b503461000e57600036600319011261000e5761036f60406101208151906103476020820183610a5f565b8082526020820190610cfb8239825193849260208452518092816020860152858501906102fa565b601f01601f19168101030190f35b503461000e57600036600319011261000e5760206040516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168152f35b506000604036600319011261045c576004356103dd8161010c565b816024359163ffffffff8316809303610458576001600160a01b0390610401610991565b169161040e8315156109e9565b823b1561045857602460405180948193621cb65b60e51b8352600483015234905af1801561044b575b61043f575080f35b61044890610a35565b80f35b610453610a81565b610437565b5080fd5b80fd5b503461000e576000602036600319011261045c57806001600160a01b036004356104888161010c565b610490610991565b1661049c8115156109e9565b803b156104c857819060046040518094819363bb9fe6bf60e01b83525af1801561044b5761043f575080f35b50fd5b503461000e5760008060031936011261045c576104e6610991565b806001600160a01b03815473ffffffffffffffffffffffffffffffffffffffff1981168355167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a380f35b503461000e57604036600319011261000e576004356105518161010c565b60243567ffffffffffffffff811161000e5761057190369060040161011d565b6101209161058160208401610a8e565b92808452610e1b60208501396105fe604051926105df846105d16001600160a01b0397887f0000000000000000000000000000000000000000000000000000000000000000169060208401610a9e565b03601f198101865285610a5f565b835160009460200185f092858416966105f9881515610b08565b610b54565b805183918161064c575b50506040519485946102f69416917f9a6cbf173278cf7dfadb45414d824f7828c0c94479f1b15e45453653070cf6579080a36001600160a01b031682526020820190565b8296945090602083920182855af193604051943d82873e1561067557935191936102f638610608565b3d85fd5b503461000e57600036600319011261000e5760206001600160a01b0360005416604051908152f35b503461000e576000604036600319011261045c576004356106c18161010c565b81602435916106cf8361010c565b6106d7610991565b6001600160a01b03809116926106ee8415156109e9565b833b156107215760249083604051958694859363611d2e7560e11b85521660048401525af1801561044b5761043f575080f35b8280fd5b503461000e57600036600319011261000e5760206040516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168152f35b503461000e5761077c6101a73661014b565b9081519160208082019384209260405193846107a78385830193849091604092825260208201520190565b03946107bb601f1996878101835282610a5f565b519020610120946107cd848701610a8e565b95808752610f3b8588013961081860405191826102b56001600160a01b03998a7f00000000000000000000000000000000000000000000000000000000000000001690898401610a9e565b8051906000940184f591848316610830811515610abc565b8194518061087d575b50604051965086956102f69516917f8967dcaa00d8fcb9bb2b5beff4aaf8c020063512cf08fbe11fec37a1e3a150f29080a46001600160a01b031682526020820190565b82978380939750865af194604051953d82883e156108a2579451939485949338610839565b3d86fd5b503461000e57602036600319011261000e576004356108c48161010c565b6108cc610991565b6001600160a01b0380911680156109265760009182548273ffffffffffffffffffffffffffffffffffffffff198216178455167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08380a380f35b60405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608490fd5b6001600160a01b036000541633036109a557565b606460405162461bcd60e51b815260206004820152602060248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152fd5b156109f057565b60405162461bcd60e51b815260206004820152601260248201527f496e76616c6964204550206164647265737300000000000000000000000000006044820152606490fd5b67ffffffffffffffff8111610a4957604052565b634e487b7160e01b600052604160045260246000fd5b90601f8019910116810190811067ffffffffffffffff821117610a4957604052565b506040513d6000823e3d90fd5b90610a9c6040519283610a5f565b565b6020929190610ab48492828151948592016102fa565b019081520190565b15610ac357565b60405162461bcd60e51b815260206004820152601360248201527f437265617465322063616c6c206661696c6564000000000000000000000000006044820152606490fd5b15610b0f57565b60405162461bcd60e51b815260206004820152601260248201527f4372656174652063616c6c206661696c656400000000000000000000000000006044820152606490fd5b60a490610bd7929380604051958693631bc6fec760e11b60208601526001600160a01b0390817f000000000000000000000000000000000000000000000000000000000000000016602487015216604485015260606064850152816084850152848401376000838284010152601f80199101168101036084810184520182610a5f565b9056fe6080346100aa57601f61012038819003918201601f19168301916001600160401b038311848410176100af578084926020946040528339810103126100aa57516001600160a01b0381168082036100aa5715610065573055604051605a90816100c68239f35b60405162461bcd60e51b815260206004820152601e60248201527f496e76616c696420696d706c656d656e746174696f6e206164647265737300006044820152606490fd5b600080fd5b634e487b7160e01b600052604160045260246000fdfe608060405230546000808092368280378136915af43d82803e156020573d90f35b3d90fdfea2646970667358221220a03b18dce0be0b4c9afe58a9eb85c35205e2cf087da098bbf1d23945bf89496064736f6c634300081100336080346100aa57601f61012038819003918201601f19168301916001600160401b038311848410176100af578084926020946040528339810103126100aa57516001600160a01b0381168082036100aa5715610065573055604051605a90816100c68239f35b60405162461bcd60e51b815260206004820152601e60248201527f496e76616c696420696d706c656d656e746174696f6e206164647265737300006044820152606490fd5b600080fd5b634e487b7160e01b600052604160045260246000fdfe608060405230546000808092368280378136915af43d82803e156020573d90f35b3d90fdfea2646970667358221220a03b18dce0be0b4c9afe58a9eb85c35205e2cf087da098bbf1d23945bf89496064736f6c634300081100336080346100aa57601f61012038819003918201601f19168301916001600160401b038311848410176100af578084926020946040528339810103126100aa57516001600160a01b0381168082036100aa5715610065573055604051605a90816100c68239f35b60405162461bcd60e51b815260206004820152601e60248201527f496e76616c696420696d706c656d656e746174696f6e206164647265737300006044820152606490fd5b600080fd5b634e487b7160e01b600052604160045260246000fdfe608060405230546000808092368280378136915af43d82803e156020573d90f35b3d90fdfea2646970667358221220a03b18dce0be0b4c9afe58a9eb85c35205e2cf087da098bbf1d23945bf89496064736f6c634300081100336080346100aa57601f61012038819003918201601f19168301916001600160401b038311848410176100af578084926020946040528339810103126100aa57516001600160a01b0381168082036100aa5715610065573055604051605a90816100c68239f35b60405162461bcd60e51b815260206004820152601e60248201527f496e76616c696420696d706c656d656e746174696f6e206164647265737300006044820152606490fd5b600080fd5b634e487b7160e01b600052604160045260246000fdfe608060405230546000808092368280378136915af43d82803e156020573d90f35b3d90fdfea2646970667358221220a03b18dce0be0b4c9afe58a9eb85c35205e2cf087da098bbf1d23945bf89496064736f6c63430008110033a2646970667358221220cc3855215776915d9c3562b4380fe9fbf7afb53b9434cabc4802d531f12df64364736f6c6343000811003360808060405234610016576104ca908161001c8239f35b600080fdfe60806040908082526004918236101561001757600080fd5b600091823560e01c90816223de291461031b57816301ffc9a71461029457508063150b7a021461023d578063a3f4df7e146101d6578063bc197c811461014c578063f23a6e61146100f25763ffa1ad741461007157600080fd5b346100ee57816003193601126100ee578051918183019083821067ffffffffffffffff8311176100db57506100d793508152600582527f312e302e300000000000000000000000000000000000000000000000000000006020830152519182918261041a565b0390f35b634e487b7160e01b815260418552602490fd5b5080fd5b5090346101495760a03660031901126101495761010d6103a1565b506101166103c9565b506084359067ffffffffffffffff8211610149575060209261013a913691016103ec565b50505163f23a6e6160e01b8152f35b80fd5b5090346101495760a0366003190112610149576101676103a1565b506101706103c9565b5067ffffffffffffffff906044358281116100ee576101929036908601610463565b50506064358281116100ee576101ab9036908601610463565b505060843591821161014957506020926101c7913691016103ec565b50505163bc197c8160e01b8152f35b50346100ee57816003193601126100ee578051918183019083821067ffffffffffffffff8311176100db57506100d793508152601882527f44656661756c742043616c6c6261636b2048616e646c657200000000000000006020830152519182918261041a565b509034610149576080366003190112610149576102586103a1565b506102616103c9565b506064359067ffffffffffffffff82116101495750602092610285913691016103ec565b505051630a85bd0160e11b8152f35b83908534610317576020366003190112610317573563ffffffff60e01b81168091036103175760209250630271189760e51b8114908115610306575b81156102f6575b81156102e5575b5015158152f35b6301ffc9a760e01b149050836102de565b6223de2960e01b811491506102d7565b630a85bd0160e11b811491506102d0565b8280fd5b8385346100ee5760c03660031901126100ee576103366103a1565b5061033f6103c9565b5060443573ffffffffffffffffffffffffffffffffffffffff8116036100ee5767ffffffffffffffff9060843582811161039d5761038090369083016103ec565b505060a43591821161031757610398913691016103ec565b505080f35b8380fd5b6004359073ffffffffffffffffffffffffffffffffffffffff821682036103c457565b600080fd5b6024359073ffffffffffffffffffffffffffffffffffffffff821682036103c457565b9181601f840112156103c45782359167ffffffffffffffff83116103c457602083818601950101116103c457565b6020808252825181830181905290939260005b82811061044f57505060409293506000838284010152601f8019910116010190565b81810186015184820160400152850161042d565b9181601f840112156103c45782359167ffffffffffffffff83116103c4576020808501948460051b0101116103c45756fea2646970667358221220e22ad453b03efac358b2f092a996c1bf999c6cba4b1e5c7d1e917139d697fca764736f6c63430008110033", - "deployedBytecode": "0x60806040526004361015610013575b600080fd5b60003560e01c80632e7a1a831461010357806331c884df146100fa5780633b3cb143146100f157806345171159146100e85780634a1ce599146100df578063715018a6146100d6578063743b1e03146100cd5780638da5cb5b146100c4578063b36f9705146100bb578063daf0dfc8146100b2578063df20ffbc146100a95763f2fde38b146100a157600080fd5b61000e6108a6565b5061000e61076a565b5061000e610725565b5061000e6106a1565b5061000e610679565b5061000e610533565b5061000e6104cb565b5061000e61045f565b5061000e6103c2565b5061000e61037d565b5061000e61031d565b5061000e61018c565b6001600160a01b0381160361000e57565b9181601f8401121561000e5782359167ffffffffffffffff831161000e576020838186019501011161000e57565b90606060031983011261000e576004356101648161010c565b916024359067ffffffffffffffff821161000e576101849160040161011d565b909160443590565b503461000e576102f66102dc6102d06101b16101a73661014b565b9392919091610b54565b6102c1610120916020926101c6848201610a8e565b90808252610bdb858301396040519461024a61025687610214888201956001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169087610a9e565b0394610228601f19968781018b528a610a5f565b8781519101209260405192839189830195869091604092825260208201520190565b03858101835282610a5f565b519020945190206040517fff000000000000000000000000000000000000000000000000000000000000009481019485523060601b6bffffffffffffffffffffffff191660018601526015850195909552603584015291929182605585015b03908101835282610a5f565b5190206001600160a01b031690565b6001600160a01b031690565b6040516001600160a01b0390911681529081906020820190565b0390f35b60005b83811061030d5750506000910152565b81810151838201526020016102fd565b503461000e57600036600319011261000e5761036f60406101208151906103476020820183610a5f565b8082526020820190610cfb8239825193849260208452518092816020860152858501906102fa565b601f01601f19168101030190f35b503461000e57600036600319011261000e5760206040516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168152f35b506000604036600319011261045c576004356103dd8161010c565b816024359163ffffffff8316809303610458576001600160a01b0390610401610991565b169161040e8315156109e9565b823b1561045857602460405180948193621cb65b60e51b8352600483015234905af1801561044b575b61043f575080f35b61044890610a35565b80f35b610453610a81565b610437565b5080fd5b80fd5b503461000e576000602036600319011261045c57806001600160a01b036004356104888161010c565b610490610991565b1661049c8115156109e9565b803b156104c857819060046040518094819363bb9fe6bf60e01b83525af1801561044b5761043f575080f35b50fd5b503461000e5760008060031936011261045c576104e6610991565b806001600160a01b03815473ffffffffffffffffffffffffffffffffffffffff1981168355167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a380f35b503461000e57604036600319011261000e576004356105518161010c565b60243567ffffffffffffffff811161000e5761057190369060040161011d565b6101209161058160208401610a8e565b92808452610e1b60208501396105fe604051926105df846105d16001600160a01b0397887f0000000000000000000000000000000000000000000000000000000000000000169060208401610a9e565b03601f198101865285610a5f565b835160009460200185f092858416966105f9881515610b08565b610b54565b805183918161064c575b50506040519485946102f69416917f9a6cbf173278cf7dfadb45414d824f7828c0c94479f1b15e45453653070cf6579080a36001600160a01b031682526020820190565b8296945090602083920182855af193604051943d82873e1561067557935191936102f638610608565b3d85fd5b503461000e57600036600319011261000e5760206001600160a01b0360005416604051908152f35b503461000e576000604036600319011261045c576004356106c18161010c565b81602435916106cf8361010c565b6106d7610991565b6001600160a01b03809116926106ee8415156109e9565b833b156107215760249083604051958694859363611d2e7560e11b85521660048401525af1801561044b5761043f575080f35b8280fd5b503461000e57600036600319011261000e5760206040516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168152f35b503461000e5761077c6101a73661014b565b9081519160208082019384209260405193846107a78385830193849091604092825260208201520190565b03946107bb601f1996878101835282610a5f565b519020610120946107cd848701610a8e565b95808752610f3b8588013961081860405191826102b56001600160a01b03998a7f00000000000000000000000000000000000000000000000000000000000000001690898401610a9e565b8051906000940184f591848316610830811515610abc565b8194518061087d575b50604051965086956102f69516917f8967dcaa00d8fcb9bb2b5beff4aaf8c020063512cf08fbe11fec37a1e3a150f29080a46001600160a01b031682526020820190565b82978380939750865af194604051953d82883e156108a2579451939485949338610839565b3d86fd5b503461000e57602036600319011261000e576004356108c48161010c565b6108cc610991565b6001600160a01b0380911680156109265760009182548273ffffffffffffffffffffffffffffffffffffffff198216178455167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08380a380f35b60405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608490fd5b6001600160a01b036000541633036109a557565b606460405162461bcd60e51b815260206004820152602060248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152fd5b156109f057565b60405162461bcd60e51b815260206004820152601260248201527f496e76616c6964204550206164647265737300000000000000000000000000006044820152606490fd5b67ffffffffffffffff8111610a4957604052565b634e487b7160e01b600052604160045260246000fd5b90601f8019910116810190811067ffffffffffffffff821117610a4957604052565b506040513d6000823e3d90fd5b90610a9c6040519283610a5f565b565b6020929190610ab48492828151948592016102fa565b019081520190565b15610ac357565b60405162461bcd60e51b815260206004820152601360248201527f437265617465322063616c6c206661696c6564000000000000000000000000006044820152606490fd5b15610b0f57565b60405162461bcd60e51b815260206004820152601260248201527f4372656174652063616c6c206661696c656400000000000000000000000000006044820152606490fd5b60a490610bd7929380604051958693631bc6fec760e11b60208601526001600160a01b0390817f000000000000000000000000000000000000000000000000000000000000000016602487015216604485015260606064850152816084850152848401376000838284010152601f80199101168101036084810184520182610a5f565b9056fe6080346100aa57601f61012038819003918201601f19168301916001600160401b038311848410176100af578084926020946040528339810103126100aa57516001600160a01b0381168082036100aa5715610065573055604051605a90816100c68239f35b60405162461bcd60e51b815260206004820152601e60248201527f496e76616c696420696d706c656d656e746174696f6e206164647265737300006044820152606490fd5b600080fd5b634e487b7160e01b600052604160045260246000fdfe608060405230546000808092368280378136915af43d82803e156020573d90f35b3d90fdfea2646970667358221220a03b18dce0be0b4c9afe58a9eb85c35205e2cf087da098bbf1d23945bf89496064736f6c634300081100336080346100aa57601f61012038819003918201601f19168301916001600160401b038311848410176100af578084926020946040528339810103126100aa57516001600160a01b0381168082036100aa5715610065573055604051605a90816100c68239f35b60405162461bcd60e51b815260206004820152601e60248201527f496e76616c696420696d706c656d656e746174696f6e206164647265737300006044820152606490fd5b600080fd5b634e487b7160e01b600052604160045260246000fdfe608060405230546000808092368280378136915af43d82803e156020573d90f35b3d90fdfea2646970667358221220a03b18dce0be0b4c9afe58a9eb85c35205e2cf087da098bbf1d23945bf89496064736f6c634300081100336080346100aa57601f61012038819003918201601f19168301916001600160401b038311848410176100af578084926020946040528339810103126100aa57516001600160a01b0381168082036100aa5715610065573055604051605a90816100c68239f35b60405162461bcd60e51b815260206004820152601e60248201527f496e76616c696420696d706c656d656e746174696f6e206164647265737300006044820152606490fd5b600080fd5b634e487b7160e01b600052604160045260246000fdfe608060405230546000808092368280378136915af43d82803e156020573d90f35b3d90fdfea2646970667358221220a03b18dce0be0b4c9afe58a9eb85c35205e2cf087da098bbf1d23945bf89496064736f6c634300081100336080346100aa57601f61012038819003918201601f19168301916001600160401b038311848410176100af578084926020946040528339810103126100aa57516001600160a01b0381168082036100aa5715610065573055604051605a90816100c68239f35b60405162461bcd60e51b815260206004820152601e60248201527f496e76616c696420696d706c656d656e746174696f6e206164647265737300006044820152606490fd5b600080fd5b634e487b7160e01b600052604160045260246000fdfe608060405230546000808092368280378136915af43d82803e156020573d90f35b3d90fdfea2646970667358221220a03b18dce0be0b4c9afe58a9eb85c35205e2cf087da098bbf1d23945bf89496064736f6c63430008110033a2646970667358221220cc3855215776915d9c3562b4380fe9fbf7afb53b9434cabc4802d531f12df64364736f6c63430008110033", - "linkReferences": {}, - "deployedLinkReferences": {} -} diff --git a/packages/common/abis/biconomy_v2.0.0/SmartAccount_v2.0.0.json b/packages/common/abis/biconomy_v2.0.0/SmartAccount_v2.0.0.json deleted file mode 100644 index ce7a7284d..000000000 --- a/packages/common/abis/biconomy_v2.0.0/SmartAccount_v2.0.0.json +++ /dev/null @@ -1,1182 +0,0 @@ -{ - "_format": "hh-sol-artifact-1", - "contractName": "SmartAccount", - "sourceName": "contracts/smart-account/SmartAccount.sol", - "abi": [ - { - "inputs": [ - { - "internalType": "contract IEntryPoint", - "name": "anEntryPoint", - "type": "address" - } - ], - "stateMutability": "nonpayable", - "type": "constructor" - }, - { - "inputs": [], - "name": "AlreadyInitialized", - "type": "error" - }, - { - "inputs": [], - "name": "BaseImplementationCannotBeZero", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "caller", - "type": "address" - } - ], - "name": "CallerIsNotAnEntryPoint", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "caller", - "type": "address" - } - ], - "name": "CallerIsNotEntryPoint", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "caller", - "type": "address" - } - ], - "name": "CallerIsNotEntryPointOrOwner", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "caller", - "type": "address" - } - ], - "name": "CallerIsNotEntryPointOrSelf", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "caller", - "type": "address" - } - ], - "name": "CallerIsNotOwner", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "caller", - "type": "address" - } - ], - "name": "CallerIsNotSelf", - "type": "error" - }, - { - "inputs": [], - "name": "DelegateCallsOnly", - "type": "error" - }, - { - "inputs": [], - "name": "EntryPointCannotBeZero", - "type": "error" - }, - { - "inputs": [], - "name": "HandlerCannotBeZero", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "implementationAddress", - "type": "address" - } - ], - "name": "InvalidImplementation", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "caller", - "type": "address" - } - ], - "name": "MixedAuthFail", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "module", - "type": "address" - } - ], - "name": "ModuleAlreadyEnabled", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "expectedModule", - "type": "address" - }, - { - "internalType": "address", - "name": "returnedModule", - "type": "address" - }, - { - "internalType": "address", - "name": "prevModule", - "type": "address" - } - ], - "name": "ModuleAndPrevModuleMismatch", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "module", - "type": "address" - } - ], - "name": "ModuleCannotBeZeroOrSentinel", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "module", - "type": "address" - } - ], - "name": "ModuleNotEnabled", - "type": "error" - }, - { - "inputs": [], - "name": "ModulesAlreadyInitialized", - "type": "error" - }, - { - "inputs": [], - "name": "ModulesSetupExecutionFailed", - "type": "error" - }, - { - "inputs": [], - "name": "OwnerCanNotBeSelf", - "type": "error" - }, - { - "inputs": [], - "name": "OwnerCannotBeZero", - "type": "error" - }, - { - "inputs": [], - "name": "OwnerProvidedIsSame", - "type": "error" - }, - { - "inputs": [], - "name": "TransferToZeroAddressAttempt", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "destLength", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "valueLength", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "funcLength", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "operationLength", - "type": "uint256" - } - ], - "name": "WrongBatchProvided", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "bytes", - "name": "contractSignature", - "type": "bytes" - } - ], - "name": "WrongContractSignature", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "uintS", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "contractSignatureLength", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "signatureLength", - "type": "uint256" - } - ], - "name": "WrongContractSignatureFormat", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "moduleAddressProvided", - "type": "address" - } - ], - "name": "WrongValidationModule", - "type": "error" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "previousHandler", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "handler", - "type": "address" - } - ], - "name": "ChangedFallbackHandler", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "address", - "name": "module", - "type": "address" - } - ], - "name": "DisabledModule", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "address", - "name": "module", - "type": "address" - } - ], - "name": "EnabledModule", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "indexed": true, - "internalType": "uint256", - "name": "value", - "type": "uint256" - }, - { - "indexed": true, - "internalType": "bytes", - "name": "data", - "type": "bytes" - }, - { - "indexed": false, - "internalType": "enum Enum.Operation", - "name": "operation", - "type": "uint8" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "txGas", - "type": "uint256" - } - ], - "name": "ExecutionFailure", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "module", - "type": "address" - } - ], - "name": "ExecutionFromModuleFailure", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "module", - "type": "address" - } - ], - "name": "ExecutionFromModuleSuccess", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "indexed": true, - "internalType": "uint256", - "name": "value", - "type": "uint256" - }, - { - "indexed": true, - "internalType": "bytes", - "name": "data", - "type": "bytes" - }, - { - "indexed": false, - "internalType": "enum Enum.Operation", - "name": "operation", - "type": "uint8" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "txGas", - "type": "uint256" - } - ], - "name": "ExecutionSuccess", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "oldImplementation", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "newImplementation", - "type": "address" - } - ], - "name": "ImplementationUpdated", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "address", - "name": "module", - "type": "address" - }, - { - "indexed": false, - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "value", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "bytes", - "name": "data", - "type": "bytes" - }, - { - "indexed": false, - "internalType": "enum Enum.Operation", - "name": "operation", - "type": "uint8" - } - ], - "name": "ModuleTransaction", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "sender", - "type": "address" - }, - { - "indexed": true, - "internalType": "uint256", - "name": "value", - "type": "uint256" - } - ], - "name": "SmartAccountReceivedNativeToken", - "type": "event" - }, - { - "stateMutability": "nonpayable", - "type": "fallback" - }, - { - "inputs": [], - "name": "VERSION", - "outputs": [ - { - "internalType": "string", - "name": "", - "type": "string" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "addDeposit", - "outputs": [], - "stateMutability": "payable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "prevModule", - "type": "address" - }, - { - "internalType": "address", - "name": "module", - "type": "address" - } - ], - "name": "disableModule", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "module", - "type": "address" - } - ], - "name": "enableModule", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "entryPoint", - "outputs": [ - { - "internalType": "contract IEntryPoint", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address[]", - "name": "to", - "type": "address[]" - }, - { - "internalType": "uint256[]", - "name": "value", - "type": "uint256[]" - }, - { - "internalType": "bytes[]", - "name": "data", - "type": "bytes[]" - }, - { - "internalType": "enum Enum.Operation[]", - "name": "operations", - "type": "uint8[]" - } - ], - "name": "execBatchTransactionFromModule", - "outputs": [ - { - "internalType": "bool", - "name": "success", - "type": "bool" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "internalType": "uint256", - "name": "value", - "type": "uint256" - }, - { - "internalType": "bytes", - "name": "data", - "type": "bytes" - }, - { - "internalType": "enum Enum.Operation", - "name": "operation", - "type": "uint8" - }, - { - "internalType": "uint256", - "name": "txGas", - "type": "uint256" - } - ], - "name": "execTransactionFromModule", - "outputs": [ - { - "internalType": "bool", - "name": "success", - "type": "bool" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "internalType": "uint256", - "name": "value", - "type": "uint256" - }, - { - "internalType": "bytes", - "name": "data", - "type": "bytes" - }, - { - "internalType": "enum Enum.Operation", - "name": "operation", - "type": "uint8" - } - ], - "name": "execTransactionFromModule", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "internalType": "uint256", - "name": "value", - "type": "uint256" - }, - { - "internalType": "bytes", - "name": "data", - "type": "bytes" - }, - { - "internalType": "enum Enum.Operation", - "name": "operation", - "type": "uint8" - } - ], - "name": "execTransactionFromModuleReturnData", - "outputs": [ - { - "internalType": "bool", - "name": "success", - "type": "bool" - }, - { - "internalType": "bytes", - "name": "returnData", - "type": "bytes" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "dest", - "type": "address" - }, - { - "internalType": "uint256", - "name": "value", - "type": "uint256" - }, - { - "internalType": "bytes", - "name": "func", - "type": "bytes" - } - ], - "name": "execute", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address[]", - "name": "dest", - "type": "address[]" - }, - { - "internalType": "uint256[]", - "name": "value", - "type": "uint256[]" - }, - { - "internalType": "bytes[]", - "name": "func", - "type": "bytes[]" - } - ], - "name": "executeBatch", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address[]", - "name": "dest", - "type": "address[]" - }, - { - "internalType": "uint256[]", - "name": "value", - "type": "uint256[]" - }, - { - "internalType": "bytes[]", - "name": "func", - "type": "bytes[]" - } - ], - "name": "executeBatch_y6U", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "dest", - "type": "address" - }, - { - "internalType": "uint256", - "name": "value", - "type": "uint256" - }, - { - "internalType": "bytes", - "name": "func", - "type": "bytes" - } - ], - "name": "execute_ncC", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "getDeposit", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "getFallbackHandler", - "outputs": [ - { - "internalType": "address", - "name": "_handler", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "getImplementation", - "outputs": [ - { - "internalType": "address", - "name": "_implementation", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "start", - "type": "address" - }, - { - "internalType": "uint256", - "name": "pageSize", - "type": "uint256" - } - ], - "name": "getModulesPaginated", - "outputs": [ - { - "internalType": "address[]", - "name": "array", - "type": "address[]" - }, - { - "internalType": "address", - "name": "next", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "handler", - "type": "address" - }, - { - "internalType": "address", - "name": "moduleSetupContract", - "type": "address" - }, - { - "internalType": "bytes", - "name": "moduleSetupData", - "type": "bytes" - } - ], - "name": "init", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "module", - "type": "address" - } - ], - "name": "isModuleEnabled", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "dataHash", - "type": "bytes32" - }, - { - "internalType": "bytes", - "name": "signature", - "type": "bytes" - } - ], - "name": "isValidSignature", - "outputs": [ - { - "internalType": "bytes4", - "name": "", - "type": "bytes4" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint192", - "name": "_key", - "type": "uint192" - } - ], - "name": "nonce", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "name": "noncesDeprecated", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "ownerDeprecated", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "handler", - "type": "address" - } - ], - "name": "setFallbackHandler", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "setupContract", - "type": "address" - }, - { - "internalType": "bytes", - "name": "setupData", - "type": "bytes" - } - ], - "name": "setupAndEnableModule", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes4", - "name": "_interfaceId", - "type": "bytes4" - } - ], - "name": "supportsInterface", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_implementation", - "type": "address" - } - ], - "name": "updateImplementation", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "components": [ - { - "internalType": "address", - "name": "sender", - "type": "address" - }, - { - "internalType": "uint256", - "name": "nonce", - "type": "uint256" - }, - { - "internalType": "bytes", - "name": "initCode", - "type": "bytes" - }, - { - "internalType": "bytes", - "name": "callData", - "type": "bytes" - }, - { - "internalType": "uint256", - "name": "callGasLimit", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "verificationGasLimit", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "preVerificationGas", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "maxFeePerGas", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "maxPriorityFeePerGas", - "type": "uint256" - }, - { - "internalType": "bytes", - "name": "paymasterAndData", - "type": "bytes" - }, - { - "internalType": "bytes", - "name": "signature", - "type": "bytes" - } - ], - "internalType": "struct UserOperation", - "name": "userOp", - "type": "tuple" - }, - { - "internalType": "bytes32", - "name": "userOpHash", - "type": "bytes32" - }, - { - "internalType": "uint256", - "name": "missingAccountFunds", - "type": "uint256" - } - ], - "name": "validateUserOp", - "outputs": [ - { - "internalType": "uint256", - "name": "validationData", - "type": "uint256" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address payable", - "name": "withdrawAddress", - "type": "address" - }, - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "name": "withdrawDepositTo", - "outputs": [], - "stateMutability": "payable", - "type": "function" - }, - { - "stateMutability": "payable", - "type": "receive" - } - ], - "bytecode": "0x60c0346100fc57601f61213e38819003918201601f19168301916001600160401b03831184841017610101578084926020946040528339810103126100fc57516001600160a01b0381168082036100fc573060a052156100ea57608052600160008181526020527fada5013122d395ba3c54772283fb069b10426056ef8ca54750cb9bb552a59e7d80546001600160a01b03191690911790556040516120269081610118823960805181818161096f01528181610b6201528181610c0301528181610f2101528181610f740152818161119e0152818161193b0152611996015260a051816114dd0152f35b60405163091748f960e21b8152600490fd5b600080fd5b634e487b7160e01b600052604160045260246000fdfe60806040526004361015610030575b36156100285734610023576100216119d6565b005b600080fd5b6100216114d3565b60003560e01c8061189a146101b357806146801461021657806301ffc9a71461025e578063025b22bc146102555780631626ba7e1461024c57806321632045146102435780632d9ad53d1461023a578063378dfd8e146102315780633a871cdd14610228578063468721a71461021f57806347e1da2a146102165780634a58db191461020d5780634d44560d146102045780635229073f146101fb5780635305dd27146101f2578063610b5925146101e95780636424e9fe146101e0578063856dfd99146101d7578063aaf10f42146101ce578063acfdf503146101c5578063b0d691fe146101bc578063b61d27f6146101b3578063c399ec88146101aa578063cc2f8452146101a1578063d86f2b3c14610198578063e009cfde1461018f578063f08a032314610186578063f33623b11461017d5763ffa1ad740361000e57610178611439565b61000e565b5061017861140c565b506101786113de565b5061017861120c565b5061017861113a565b50610178611038565b50610178610f45565b506101786102b3565b50610178610f00565b50610178610e5d565b50610178610e36565b50610178610def565b50610178610dc7565b50610178610d99565b50610178610d2d565b50610178610cab565b50610178610bd4565b50610178610b4a565b50610178610342565b50610178610afc565b50610178610929565b506101786107c8565b5061017861076a565b506101786106ab565b5061017861064f565b5061017861049d565b50610178610461565b6001600160a01b0381160361002357565b359061028382610267565b565b9181601f840112156100235782359167ffffffffffffffff8311610023576020838186019501011161002357565b5034610023576060366003190112610023576004356102d181610267565b6044359067ffffffffffffffff8211610023576103076102f8610021933690600401610285565b61030061198c565b36916105fa565b906024359061190d565b9181601f840112156100235782359167ffffffffffffffff8311610023576020808501948460051b01011161002357565b50346100235760603660031901126100235767ffffffffffffffff60043581811161002357610375903690600401610311565b906024358381116100235761038e903690600401610311565b93604435908111610023576103a7903690600401610311565b926103b061198c565b84158015610445575b801561043b575b61040f5760005b8581106103d057005b806104096103e96103e46001948a87611745565b611763565b6103f4838b89611745565b35610403610300858b8a61176d565b9161190d565b016103c7565b5050506084926040519263470c355760e01b845260048401526024830152604482015260006064820152fd5b50838614156103c0565b50858514156103b9565b6001600160e01b031981160361002357565b50346100235760203660031901126100235760206004356104818161044f565b6040516001600160e01b03199091166301ffc9a760e01b148152f35b5034610023576020366003190112610023576004356104bb81610267565b6104c3611931565b6001600160a01b0380821691821561053057803b15610509573054903055167faa3f731066a578e5f39b4215468d826cdd15373cbc0dfc9cb9bdc649718ef7da600080a3005b604051630c76093760e01b81526001600160a01b03919091166004820152602490fd5b0390fd5b60405162461bcd60e51b815260206004820152601660248201527f416464726573732063616e6e6f74206265207a65726f000000000000000000006044820152606490fd5b50634e487b7160e01b600052604160045260246000fd5b67ffffffffffffffff81116105a057604052565b6105a8610575565b604052565b90601f8019910116810190811067ffffffffffffffff8211176105a057604052565b60209067ffffffffffffffff81116105ed575b601f01601f19160190565b6105f5610575565b6105e2565b929192610606826105cf565b9161061460405193846105ad565b829481845281830111610023578281602093846000960137010152565b9080601f830112156100235781602061064c933591016105fa565b90565b50346100235760403660031901126100235760243567ffffffffffffffff81116100235761068e6106866020923690600401610631565b600435611834565b6040516001600160e01b03199091168152f35b6002111561002357565b50346100235760a0366003190112610023576004356106c981610267565b60443567ffffffffffffffff8111610023576106e9903690600401610631565b90606435906106f7826106a1565b6084359160013314801561074b575b61073357602093610723938061072d57505a925b60243590611b5a565b6040519015158152f35b9261071a565b6040516321ac7c5f60e01b8152336004820152602490fd5b503360005260006020526001600160a01b036040600020541615610706565b503461002357602036600319011261002357602060043561078a81610267565b6001600160a01b0380911690816001141591826107ae575b50506040519015158152f35b9091506000526000825260406000205416151538806107a2565b5034610023576060366003190112610023576004356107e681610267565b602435906107f382610267565b60443567ffffffffffffffff811161002357610813903690600401610285565b91909260009360018552846020526001600160a01b0393604093858588205416158015906108fd575b6108ed5791610852916103006108589594611a24565b90611f7a565b918216801580156108e3575b6108cd578282856108b1936108c997528060205261089182822060016001600160a01b0319825416179055565b6001815220906001600160a01b03166001600160a01b0319825416179055565b516001600160a01b0390911681529081906020820190565b0390f35b602491519063cadb248f60e01b82526004820152fd5b5060018114610864565b845162dc149f60e41b8152600490fd5b50857f6c9a6c4a39284e37ed1cf53d337577d14212a4870fb976a4366c693b939918d45416151561083c565b503461002357600319606036820112610023576004359067ffffffffffffffff82116100235761016082600401918336030112610023576000906001600160a01b0392837f0000000000000000000000000000000000000000000000000000000000000000163303610a9b576109af6109a76101448693018461153d565b810190611570565b905016926109e06109d3856001600160a01b03166000526000602052604060002090565b546001600160a01b031690565b1615610a7a576020610a116108c9948493604051948580948193637ff9adb960e11b835260243590600484016115fa565b03925af1918215610a6d575b91610a3f575b50610a2f6044356116f1565b6040519081529081906020820190565b610a60915060203d8111610a66575b610a5881836105ad565b8101906114b7565b38610a23565b503d610a4e565b610a756114c6565b610a1d565b6040516326cc3fab60e21b81526001600160a01b0384166004820152602490fd5b604051635dac3db760e11b8152336004820152602490fd5b608060031982011261002357600435610acb81610267565b91602435916044359067ffffffffffffffff821161002357610aef91600401610631565b9060643561064c816106a1565b503461002357610b0b36610ab3565b600193919333148015610b2b575b61073357602093610723935a93611b5a565b503360005260006020526001600160a01b036040600020541615610b19565b50600080600319360112610bd1576001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001681813b15610bd15760405163b760faf960e01b8152306004820152918290602490829034905af18015610bc4575b610bb8575080f35b610bc19061058c565b80f35b610bcc6114c6565b610bb0565b80fd5b5060006040366003190112610bd157600435610bef81610267565b610bf7611931565b816001600160a01b03807f00000000000000000000000000000000000000000000000000000000000000001692833b15610c5f5760449083604051958694859363040b850f60e31b855216600484015260243560248401525af18015610bc457610bb8575080f35b8280fd5b60005b838110610c765750506000910152565b8181015183820152602001610c66565b90602091610c9f81518092818552858086019101610c63565b601f01601f1916010190565b503461002357610cba36610ab3565b90600193929333148015610d0e575b61073357610cd8935a93611b5a565b6040519060203d8301016040523d82523d6000602084013e6108c960405192839215158352604060208401526040830190610c86565b503360005260006020526001600160a01b036040600020541615610cc9565b503461002357604036600319011261002357600435610d4b81610267565b60243567ffffffffffffffff811161002357602091610d71610d7f923690600401610631565b90610d7a611931565b611f7a565b610d8881611d68565b6001600160a01b0360405191168152f35b503461002357602036600319011261002357610021600435610dba81610267565b610dc2611931565b611d68565b50346100235760003660031901126100235760206001600160a01b0360315416604051908152f35b50346100235760003660031901126100235760207f6c9a6c4a39284e37ed1cf53d337577d14212a4870fb976a4366c693b939918d4546001600160a01b0360405191168152f35b503461002357600036600319011261002357602030546001600160a01b0360405191168152f35b50346100235760803660031901126100235767ffffffffffffffff60043581811161002357610e90903690600401610311565b60249291923582811161002357610eab903690600401610311565b60449491943584811161002357610ec6903690600401610311565b91606435958611610023576108c996610ee6610eee973690600401610311565b969095611c22565b60405190151581529081906020820190565b50346100235760003660031901126100235760206040516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168152f35b5034610023576000366003190112610023576040516370a0823160e01b815230600482015260209081816024817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa908115610fd4575b600091610fb7575b50604051908152f35b610fce9150823d8111610a6657610a5881836105ad565b38610fae565b610fdc6114c6565b610fa6565b90929192604082016040835281518091526060830160208093019160005b8482821061101b575050506001600160a01b0391509416910152565b84516001600160a01b031684529384019390920191600101610fff565b50346100235760403660031901126100235760043561105681610267565b60243561106281611a96565b61106f60405191826105ad565b818152601f1961107e83611a96565b013660208301376110a76109d36000946001600160a01b03166000526000602052604060002090565b6001600160a01b038116801515908161112e575b5080611125575b15611112576111066109d3826110ed61110c946110df8988611ab7565b906001600160a01b03169052565b6001600160a01b03166000526000602052604060002090565b93611ad9565b926110a7565b908381526108c960405192839283610fe1565b508284106110c2565b600191501415386110bb565b50346100235760203660031901126100235760043577ffffffffffffffffffffffffffffffffffffffffffffffff8116809103610023576108c99060405190631aab3f0d60e11b825230600483015260248201526020816044816001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000165afa9081156111ff575b6000916111e1575b506040519081529081906020820190565b6111f9915060203d8111610a6657610a5881836105ad565b386111d0565b6112076114c6565b6111c8565b50346100235760403660031901126100235760043561122a81610267565b60243561123681610267565b61123e611931565b6001600160a01b038116801580156113d4575b6113b3576112846112786109d3856001600160a01b03166000526000602052604060002090565b6001600160a01b031690565b03611359578061130a7faab4fa2b463f581b2b32cb3b7e3b704b9ce37cc209b5fb4d77e593ace4054276936112ef6112d56109d3611354966001600160a01b03166000526000602052604060002090565b916001600160a01b03166000526000602052604060002090565b906001600160a01b03166001600160a01b0319825416179055565b61133a61132a826001600160a01b03166000526000602052604060002090565b6001600160a01b03198154169055565b6040516001600160a01b0390911681529081906020820190565b0390a1005b61052c61137c6109d3846001600160a01b03166000526000602052604060002090565b604051633103525b60e21b81526001600160a01b039384166004820152908316602482015292909116604483015281906064820190565b60405163cadb248f60e01b81526001600160a01b0383166004820152602490fd5b5060018114611251565b5034610023576020366003190112610023576100216004356113ff81610267565b611407611931565b611a24565b50346100235760203660031901126100235760043560005260326020526020604060002054604051908152f35b5034610023576000366003190112610023576108c96040516040810181811067ffffffffffffffff8211176114aa575b604052600581527f322e302e300000000000000000000000000000000000000000000000000000006020820152604051918291602083526020830190610c86565b6114b2610575565b611469565b90816020910312610023575190565b506040513d6000823e3d90fd5b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016301461152b5734337ed05ab44e279ac59e855cb75dc2ae23b200ad994797b6f1f028f96a46ecce02600080a3565b604051633c97166560e21b8152600490fd5b903590601e1981360301821215610023570180359067ffffffffffffffff82116100235760200191813603831361002357565b919060408382031261002357823567ffffffffffffffff81116100235760209161159b918501610631565b92013561064c81610267565b9035601e198236030181121561002357016020813591019167ffffffffffffffff821161002357813603831361002357565b908060209392818452848401376000828201840152601f01601f1916010190565b9291906116ec611657602092604087526116276040880161161a83610278565b6001600160a01b03169052565b8381013560608801526116dc61164060408301836115a7565b9390610160948560808c01526101a08b01916115d9565b916116d361167f61166b60608401846115a7565b603f198d8803810160a08f015296916115d9565b608083013560c08c015260a083013560e08c01528a6101009660c0850135888301526116c361012060e087013581850152610140998701358a8501528601866115a7565b92909188828603019101526115d9565b938101906115a7565b91888403016101808901526115d9565b930152565b806116f95750565b600080808093338219f1503d15610283573d611714816105cf565b9061172260405192836105ad565b8152600060203d92013e565b50634e487b7160e01b600052603260045260246000fd5b9190811015611756575b60051b0190565b61175e61172e565b61174f565b3561064c81610267565b90916117869281101561178a575b60051b81019061153d565b9091565b61179261172e565b61177b565b919060408382031261002357825167ffffffffffffffff81116100235783019080601f83011215610023578151916117ce836105cf565b916117dc60405193846105ad565b83835260208483010111610023576020926117fc91848085019101610c63565b92015161064c81610267565b90816020910312610023575161064c8161044f565b60409061064c939281528160208201520190610c86565b906118489060208082518301019101611797565b90916001600160a01b03809216916118766109d3846001600160a01b03166000526000602052604060002090565b16156118ec57916020916118a093604051809581948293630b135d3f60e11b84526004840161181d565b03915afa9081156118df575b6000916118b7575090565b61064c915060203d81116118d8575b6118d081836105ad565b810190611808565b503d6118c6565b6118e76114c6565b6118ac565b6040516326cc3fab60e21b81526001600160a01b0383166004820152602490fd5b916000928392602083519301915af1604051903d6000833e1561192d5750565b3d90fd5b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001633141580611982575b61196a57565b604051634776242160e01b8152336004820152602490fd5b5030331415611964565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001633036119be57565b60405163e6fce6a560e01b8152336004820152602490fd5b507f6c9a6c4a39284e37ed1cf53d337577d14212a4870fb976a4366c693b939918d4548015610021576000808092368280373360601b3652818060143601925af13d82803e1561192d573d90f35b6001600160a01b03808216918215611a84577f6c9a6c4a39284e37ed1cf53d337577d14212a4870fb976a4366c693b939918d49081549155167f06be9a1bea257286cf2afa8205ed494ca9d6a4b41aa58d04238deebada20fb0c600080a3565b60405163dd449f5f60e01b8152600490fd5b60209067ffffffffffffffff8111611aaf5760051b0190565b61175e610575565b6020918151811015611acc575b60051b010190565b611ad461172e565b611ac4565b6000198114611ae85760010190565b634e487b7160e01b600052601160045260246000fd5b611b1690602060405192828480945193849201610c63565b810103902090565b906002821015611b2b5752565b634e487b7160e01b600052602160045260246000fd5b60209093929193611b56816040810196611b1e565b0152565b9493929091946002821015611b2b5760018203611c05576000808751602089018488f4955b8615611bcf577f81d12fffced46c214dfae8ab8fa0b9f7b69f70c9d500e33f612f2105deb261ee91611bca611bbb6001600160a01b0393611afe565b96604051938493169583611b41565b0390a4565b7f3ddd038f78c876172d5dbfd730b14c9f8692dfa197ef104eaac6df3f85a0874a91611bca611bbb6001600160a01b0393611afe565b600080875160208901868589f195611b7f565b3561064c816106a1565b9497969391929795909560009887158015611d5e575b8015611d54575b8015611d4a575b611d1b576001978833148015611ceb575b6107335797969594939291906000985b808a10611c7a5750505050505050505050565b9091929394959697899b50611cdb888888611cd589869f8f81611cc0818e611cb98f968f97611cb36103e483611ccd9b611cc89b611745565b9c611745565b359861176d565b989094611745565b611c18565b9436916105fa565b91611eab565b9b01989796959493929190611c67565b506001600160a01b03611d146109d3336001600160a01b03166000526000602052604060002090565b1615611c57565b60405163470c355760e01b81526004810189905260248101919091526044810182905260648101869052608490fd5b5085821415611c46565b5081811415611c3f565b5080881415611c38565b6001600160a01b0381168015908115611ea0575b50611e7d57611da46112786109d3836001600160a01b03166000526000602052604060002090565b611e5a57600160009081526020527fecdf3a3effea5783a3c4c2140e677577666428d44ed9d474a0b3a4c9943f844090611e5590611e21611e047fada5013122d395ba3c54772283fb069b10426056ef8ca54750cb9bb552a59e7d6109d3565b6112ef836001600160a01b03166000526000602052604060002090565b6001600090815260205261133a817fada5013122d395ba3c54772283fb069b10426056ef8ca54750cb9bb552a59e7d6112ef565b0390a1565b60405163b29d459560e01b81526001600160a01b03919091166004820152602490fd5b60405163cadb248f60e01b81526001600160a01b03919091166004820152602490fd5b600191501438611d7c565b939293611ebb5a86858585611b5a565b948515611f4e57611f23611f187f8c014e41cffd68ba64f3e7830b8b2e4ee860509d8deab25ebbcbba2f0405e2da956001600160a01b0395604051968796338852166020870152604086015260a0606086015260a0850190610c86565b916080840190611b1e565b0390a1337f6895c13664aa4f67288b25d7a21d7aaa34916e355fb9b6fae0a139a9085becb8600080a2565b50505050337facd2c8702804128fdb0db2bb49f6d127dd0181c13fd45dbfe16de0930e2bd375600080a2565b6001600160a01b03811615611fab5781600092918360208194519301915af1604051903d6000833e1561192d575190565b60405162461bcd60e51b815260206004820152601a60248201527f57726f6e67204d6f64756c6520536574757020416464726573730000000000006044820152606490fdfea26469706673582212205e35c32c65281399d0271586e25905b496a0e4ccfd6e3ff9ffae2c43380c16ac64736f6c63430008110033", - "deployedBytecode": "0x60806040526004361015610030575b36156100285734610023576100216119d6565b005b600080fd5b6100216114d3565b60003560e01c8061189a146101b357806146801461021657806301ffc9a71461025e578063025b22bc146102555780631626ba7e1461024c57806321632045146102435780632d9ad53d1461023a578063378dfd8e146102315780633a871cdd14610228578063468721a71461021f57806347e1da2a146102165780634a58db191461020d5780634d44560d146102045780635229073f146101fb5780635305dd27146101f2578063610b5925146101e95780636424e9fe146101e0578063856dfd99146101d7578063aaf10f42146101ce578063acfdf503146101c5578063b0d691fe146101bc578063b61d27f6146101b3578063c399ec88146101aa578063cc2f8452146101a1578063d86f2b3c14610198578063e009cfde1461018f578063f08a032314610186578063f33623b11461017d5763ffa1ad740361000e57610178611439565b61000e565b5061017861140c565b506101786113de565b5061017861120c565b5061017861113a565b50610178611038565b50610178610f45565b506101786102b3565b50610178610f00565b50610178610e5d565b50610178610e36565b50610178610def565b50610178610dc7565b50610178610d99565b50610178610d2d565b50610178610cab565b50610178610bd4565b50610178610b4a565b50610178610342565b50610178610afc565b50610178610929565b506101786107c8565b5061017861076a565b506101786106ab565b5061017861064f565b5061017861049d565b50610178610461565b6001600160a01b0381160361002357565b359061028382610267565b565b9181601f840112156100235782359167ffffffffffffffff8311610023576020838186019501011161002357565b5034610023576060366003190112610023576004356102d181610267565b6044359067ffffffffffffffff8211610023576103076102f8610021933690600401610285565b61030061198c565b36916105fa565b906024359061190d565b9181601f840112156100235782359167ffffffffffffffff8311610023576020808501948460051b01011161002357565b50346100235760603660031901126100235767ffffffffffffffff60043581811161002357610375903690600401610311565b906024358381116100235761038e903690600401610311565b93604435908111610023576103a7903690600401610311565b926103b061198c565b84158015610445575b801561043b575b61040f5760005b8581106103d057005b806104096103e96103e46001948a87611745565b611763565b6103f4838b89611745565b35610403610300858b8a61176d565b9161190d565b016103c7565b5050506084926040519263470c355760e01b845260048401526024830152604482015260006064820152fd5b50838614156103c0565b50858514156103b9565b6001600160e01b031981160361002357565b50346100235760203660031901126100235760206004356104818161044f565b6040516001600160e01b03199091166301ffc9a760e01b148152f35b5034610023576020366003190112610023576004356104bb81610267565b6104c3611931565b6001600160a01b0380821691821561053057803b15610509573054903055167faa3f731066a578e5f39b4215468d826cdd15373cbc0dfc9cb9bdc649718ef7da600080a3005b604051630c76093760e01b81526001600160a01b03919091166004820152602490fd5b0390fd5b60405162461bcd60e51b815260206004820152601660248201527f416464726573732063616e6e6f74206265207a65726f000000000000000000006044820152606490fd5b50634e487b7160e01b600052604160045260246000fd5b67ffffffffffffffff81116105a057604052565b6105a8610575565b604052565b90601f8019910116810190811067ffffffffffffffff8211176105a057604052565b60209067ffffffffffffffff81116105ed575b601f01601f19160190565b6105f5610575565b6105e2565b929192610606826105cf565b9161061460405193846105ad565b829481845281830111610023578281602093846000960137010152565b9080601f830112156100235781602061064c933591016105fa565b90565b50346100235760403660031901126100235760243567ffffffffffffffff81116100235761068e6106866020923690600401610631565b600435611834565b6040516001600160e01b03199091168152f35b6002111561002357565b50346100235760a0366003190112610023576004356106c981610267565b60443567ffffffffffffffff8111610023576106e9903690600401610631565b90606435906106f7826106a1565b6084359160013314801561074b575b61073357602093610723938061072d57505a925b60243590611b5a565b6040519015158152f35b9261071a565b6040516321ac7c5f60e01b8152336004820152602490fd5b503360005260006020526001600160a01b036040600020541615610706565b503461002357602036600319011261002357602060043561078a81610267565b6001600160a01b0380911690816001141591826107ae575b50506040519015158152f35b9091506000526000825260406000205416151538806107a2565b5034610023576060366003190112610023576004356107e681610267565b602435906107f382610267565b60443567ffffffffffffffff811161002357610813903690600401610285565b91909260009360018552846020526001600160a01b0393604093858588205416158015906108fd575b6108ed5791610852916103006108589594611a24565b90611f7a565b918216801580156108e3575b6108cd578282856108b1936108c997528060205261089182822060016001600160a01b0319825416179055565b6001815220906001600160a01b03166001600160a01b0319825416179055565b516001600160a01b0390911681529081906020820190565b0390f35b602491519063cadb248f60e01b82526004820152fd5b5060018114610864565b845162dc149f60e41b8152600490fd5b50857f6c9a6c4a39284e37ed1cf53d337577d14212a4870fb976a4366c693b939918d45416151561083c565b503461002357600319606036820112610023576004359067ffffffffffffffff82116100235761016082600401918336030112610023576000906001600160a01b0392837f0000000000000000000000000000000000000000000000000000000000000000163303610a9b576109af6109a76101448693018461153d565b810190611570565b905016926109e06109d3856001600160a01b03166000526000602052604060002090565b546001600160a01b031690565b1615610a7a576020610a116108c9948493604051948580948193637ff9adb960e11b835260243590600484016115fa565b03925af1918215610a6d575b91610a3f575b50610a2f6044356116f1565b6040519081529081906020820190565b610a60915060203d8111610a66575b610a5881836105ad565b8101906114b7565b38610a23565b503d610a4e565b610a756114c6565b610a1d565b6040516326cc3fab60e21b81526001600160a01b0384166004820152602490fd5b604051635dac3db760e11b8152336004820152602490fd5b608060031982011261002357600435610acb81610267565b91602435916044359067ffffffffffffffff821161002357610aef91600401610631565b9060643561064c816106a1565b503461002357610b0b36610ab3565b600193919333148015610b2b575b61073357602093610723935a93611b5a565b503360005260006020526001600160a01b036040600020541615610b19565b50600080600319360112610bd1576001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001681813b15610bd15760405163b760faf960e01b8152306004820152918290602490829034905af18015610bc4575b610bb8575080f35b610bc19061058c565b80f35b610bcc6114c6565b610bb0565b80fd5b5060006040366003190112610bd157600435610bef81610267565b610bf7611931565b816001600160a01b03807f00000000000000000000000000000000000000000000000000000000000000001692833b15610c5f5760449083604051958694859363040b850f60e31b855216600484015260243560248401525af18015610bc457610bb8575080f35b8280fd5b60005b838110610c765750506000910152565b8181015183820152602001610c66565b90602091610c9f81518092818552858086019101610c63565b601f01601f1916010190565b503461002357610cba36610ab3565b90600193929333148015610d0e575b61073357610cd8935a93611b5a565b6040519060203d8301016040523d82523d6000602084013e6108c960405192839215158352604060208401526040830190610c86565b503360005260006020526001600160a01b036040600020541615610cc9565b503461002357604036600319011261002357600435610d4b81610267565b60243567ffffffffffffffff811161002357602091610d71610d7f923690600401610631565b90610d7a611931565b611f7a565b610d8881611d68565b6001600160a01b0360405191168152f35b503461002357602036600319011261002357610021600435610dba81610267565b610dc2611931565b611d68565b50346100235760003660031901126100235760206001600160a01b0360315416604051908152f35b50346100235760003660031901126100235760207f6c9a6c4a39284e37ed1cf53d337577d14212a4870fb976a4366c693b939918d4546001600160a01b0360405191168152f35b503461002357600036600319011261002357602030546001600160a01b0360405191168152f35b50346100235760803660031901126100235767ffffffffffffffff60043581811161002357610e90903690600401610311565b60249291923582811161002357610eab903690600401610311565b60449491943584811161002357610ec6903690600401610311565b91606435958611610023576108c996610ee6610eee973690600401610311565b969095611c22565b60405190151581529081906020820190565b50346100235760003660031901126100235760206040516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168152f35b5034610023576000366003190112610023576040516370a0823160e01b815230600482015260209081816024817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa908115610fd4575b600091610fb7575b50604051908152f35b610fce9150823d8111610a6657610a5881836105ad565b38610fae565b610fdc6114c6565b610fa6565b90929192604082016040835281518091526060830160208093019160005b8482821061101b575050506001600160a01b0391509416910152565b84516001600160a01b031684529384019390920191600101610fff565b50346100235760403660031901126100235760043561105681610267565b60243561106281611a96565b61106f60405191826105ad565b818152601f1961107e83611a96565b013660208301376110a76109d36000946001600160a01b03166000526000602052604060002090565b6001600160a01b038116801515908161112e575b5080611125575b15611112576111066109d3826110ed61110c946110df8988611ab7565b906001600160a01b03169052565b6001600160a01b03166000526000602052604060002090565b93611ad9565b926110a7565b908381526108c960405192839283610fe1565b508284106110c2565b600191501415386110bb565b50346100235760203660031901126100235760043577ffffffffffffffffffffffffffffffffffffffffffffffff8116809103610023576108c99060405190631aab3f0d60e11b825230600483015260248201526020816044816001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000165afa9081156111ff575b6000916111e1575b506040519081529081906020820190565b6111f9915060203d8111610a6657610a5881836105ad565b386111d0565b6112076114c6565b6111c8565b50346100235760403660031901126100235760043561122a81610267565b60243561123681610267565b61123e611931565b6001600160a01b038116801580156113d4575b6113b3576112846112786109d3856001600160a01b03166000526000602052604060002090565b6001600160a01b031690565b03611359578061130a7faab4fa2b463f581b2b32cb3b7e3b704b9ce37cc209b5fb4d77e593ace4054276936112ef6112d56109d3611354966001600160a01b03166000526000602052604060002090565b916001600160a01b03166000526000602052604060002090565b906001600160a01b03166001600160a01b0319825416179055565b61133a61132a826001600160a01b03166000526000602052604060002090565b6001600160a01b03198154169055565b6040516001600160a01b0390911681529081906020820190565b0390a1005b61052c61137c6109d3846001600160a01b03166000526000602052604060002090565b604051633103525b60e21b81526001600160a01b039384166004820152908316602482015292909116604483015281906064820190565b60405163cadb248f60e01b81526001600160a01b0383166004820152602490fd5b5060018114611251565b5034610023576020366003190112610023576100216004356113ff81610267565b611407611931565b611a24565b50346100235760203660031901126100235760043560005260326020526020604060002054604051908152f35b5034610023576000366003190112610023576108c96040516040810181811067ffffffffffffffff8211176114aa575b604052600581527f322e302e300000000000000000000000000000000000000000000000000000006020820152604051918291602083526020830190610c86565b6114b2610575565b611469565b90816020910312610023575190565b506040513d6000823e3d90fd5b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016301461152b5734337ed05ab44e279ac59e855cb75dc2ae23b200ad994797b6f1f028f96a46ecce02600080a3565b604051633c97166560e21b8152600490fd5b903590601e1981360301821215610023570180359067ffffffffffffffff82116100235760200191813603831361002357565b919060408382031261002357823567ffffffffffffffff81116100235760209161159b918501610631565b92013561064c81610267565b9035601e198236030181121561002357016020813591019167ffffffffffffffff821161002357813603831361002357565b908060209392818452848401376000828201840152601f01601f1916010190565b9291906116ec611657602092604087526116276040880161161a83610278565b6001600160a01b03169052565b8381013560608801526116dc61164060408301836115a7565b9390610160948560808c01526101a08b01916115d9565b916116d361167f61166b60608401846115a7565b603f198d8803810160a08f015296916115d9565b608083013560c08c015260a083013560e08c01528a6101009660c0850135888301526116c361012060e087013581850152610140998701358a8501528601866115a7565b92909188828603019101526115d9565b938101906115a7565b91888403016101808901526115d9565b930152565b806116f95750565b600080808093338219f1503d15610283573d611714816105cf565b9061172260405192836105ad565b8152600060203d92013e565b50634e487b7160e01b600052603260045260246000fd5b9190811015611756575b60051b0190565b61175e61172e565b61174f565b3561064c81610267565b90916117869281101561178a575b60051b81019061153d565b9091565b61179261172e565b61177b565b919060408382031261002357825167ffffffffffffffff81116100235783019080601f83011215610023578151916117ce836105cf565b916117dc60405193846105ad565b83835260208483010111610023576020926117fc91848085019101610c63565b92015161064c81610267565b90816020910312610023575161064c8161044f565b60409061064c939281528160208201520190610c86565b906118489060208082518301019101611797565b90916001600160a01b03809216916118766109d3846001600160a01b03166000526000602052604060002090565b16156118ec57916020916118a093604051809581948293630b135d3f60e11b84526004840161181d565b03915afa9081156118df575b6000916118b7575090565b61064c915060203d81116118d8575b6118d081836105ad565b810190611808565b503d6118c6565b6118e76114c6565b6118ac565b6040516326cc3fab60e21b81526001600160a01b0383166004820152602490fd5b916000928392602083519301915af1604051903d6000833e1561192d5750565b3d90fd5b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001633141580611982575b61196a57565b604051634776242160e01b8152336004820152602490fd5b5030331415611964565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001633036119be57565b60405163e6fce6a560e01b8152336004820152602490fd5b507f6c9a6c4a39284e37ed1cf53d337577d14212a4870fb976a4366c693b939918d4548015610021576000808092368280373360601b3652818060143601925af13d82803e1561192d573d90f35b6001600160a01b03808216918215611a84577f6c9a6c4a39284e37ed1cf53d337577d14212a4870fb976a4366c693b939918d49081549155167f06be9a1bea257286cf2afa8205ed494ca9d6a4b41aa58d04238deebada20fb0c600080a3565b60405163dd449f5f60e01b8152600490fd5b60209067ffffffffffffffff8111611aaf5760051b0190565b61175e610575565b6020918151811015611acc575b60051b010190565b611ad461172e565b611ac4565b6000198114611ae85760010190565b634e487b7160e01b600052601160045260246000fd5b611b1690602060405192828480945193849201610c63565b810103902090565b906002821015611b2b5752565b634e487b7160e01b600052602160045260246000fd5b60209093929193611b56816040810196611b1e565b0152565b9493929091946002821015611b2b5760018203611c05576000808751602089018488f4955b8615611bcf577f81d12fffced46c214dfae8ab8fa0b9f7b69f70c9d500e33f612f2105deb261ee91611bca611bbb6001600160a01b0393611afe565b96604051938493169583611b41565b0390a4565b7f3ddd038f78c876172d5dbfd730b14c9f8692dfa197ef104eaac6df3f85a0874a91611bca611bbb6001600160a01b0393611afe565b600080875160208901868589f195611b7f565b3561064c816106a1565b9497969391929795909560009887158015611d5e575b8015611d54575b8015611d4a575b611d1b576001978833148015611ceb575b6107335797969594939291906000985b808a10611c7a5750505050505050505050565b9091929394959697899b50611cdb888888611cd589869f8f81611cc0818e611cb98f968f97611cb36103e483611ccd9b611cc89b611745565b9c611745565b359861176d565b989094611745565b611c18565b9436916105fa565b91611eab565b9b01989796959493929190611c67565b506001600160a01b03611d146109d3336001600160a01b03166000526000602052604060002090565b1615611c57565b60405163470c355760e01b81526004810189905260248101919091526044810182905260648101869052608490fd5b5085821415611c46565b5081811415611c3f565b5080881415611c38565b6001600160a01b0381168015908115611ea0575b50611e7d57611da46112786109d3836001600160a01b03166000526000602052604060002090565b611e5a57600160009081526020527fecdf3a3effea5783a3c4c2140e677577666428d44ed9d474a0b3a4c9943f844090611e5590611e21611e047fada5013122d395ba3c54772283fb069b10426056ef8ca54750cb9bb552a59e7d6109d3565b6112ef836001600160a01b03166000526000602052604060002090565b6001600090815260205261133a817fada5013122d395ba3c54772283fb069b10426056ef8ca54750cb9bb552a59e7d6112ef565b0390a1565b60405163b29d459560e01b81526001600160a01b03919091166004820152602490fd5b60405163cadb248f60e01b81526001600160a01b03919091166004820152602490fd5b600191501438611d7c565b939293611ebb5a86858585611b5a565b948515611f4e57611f23611f187f8c014e41cffd68ba64f3e7830b8b2e4ee860509d8deab25ebbcbba2f0405e2da956001600160a01b0395604051968796338852166020870152604086015260a0606086015260a0850190610c86565b916080840190611b1e565b0390a1337f6895c13664aa4f67288b25d7a21d7aaa34916e355fb9b6fae0a139a9085becb8600080a2565b50505050337facd2c8702804128fdb0db2bb49f6d127dd0181c13fd45dbfe16de0930e2bd375600080a2565b6001600160a01b03811615611fab5781600092918360208194519301915af1604051903d6000833e1561192d575190565b60405162461bcd60e51b815260206004820152601a60248201527f57726f6e67204d6f64756c6520536574757020416464726573730000000000006044820152606490fdfea26469706673582212205e35c32c65281399d0271586e25905b496a0e4ccfd6e3ff9ffae2c43380c16ac64736f6c63430008110033", - "linkReferences": {}, - "deployedLinkReferences": {} -} diff --git a/packages/common/abis/entrypoint/EntryPoint_v0.0.5.json b/packages/common/abis/entrypoint/EntryPoint_v0.0.5.json deleted file mode 100644 index 270d5ded1..000000000 --- a/packages/common/abis/entrypoint/EntryPoint_v0.0.5.json +++ /dev/null @@ -1,1318 +0,0 @@ -{ - "_format": "hh-sol-artifact-1", - "contractName": "EntryPoint", - "sourceName": "contracts/core/EntryPoint.sol", - "abi": [ - { - "inputs": [ - { - "internalType": "uint256", - "name": "preOpGas", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "paid", - "type": "uint256" - }, - { - "internalType": "uint48", - "name": "validAfter", - "type": "uint48" - }, - { - "internalType": "uint48", - "name": "validUntil", - "type": "uint48" - }, - { - "internalType": "bool", - "name": "targetSuccess", - "type": "bool" - }, - { - "internalType": "bytes", - "name": "targetResult", - "type": "bytes" - } - ], - "name": "ExecutionResult", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "opIndex", - "type": "uint256" - }, - { - "internalType": "string", - "name": "reason", - "type": "string" - } - ], - "name": "FailedOp", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "sender", - "type": "address" - } - ], - "name": "SenderAddressResult", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "aggregator", - "type": "address" - } - ], - "name": "SignatureValidationFailed", - "type": "error" - }, - { - "inputs": [ - { - "components": [ - { - "internalType": "uint256", - "name": "preOpGas", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "prefund", - "type": "uint256" - }, - { - "internalType": "bool", - "name": "sigFailed", - "type": "bool" - }, - { - "internalType": "uint48", - "name": "validAfter", - "type": "uint48" - }, - { - "internalType": "uint48", - "name": "validUntil", - "type": "uint48" - }, - { - "internalType": "bytes", - "name": "paymasterContext", - "type": "bytes" - } - ], - "internalType": "struct IEntryPoint.ReturnInfo", - "name": "returnInfo", - "type": "tuple" - }, - { - "components": [ - { - "internalType": "uint256", - "name": "stake", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "unstakeDelaySec", - "type": "uint256" - } - ], - "internalType": "struct IStakeManager.StakeInfo", - "name": "senderInfo", - "type": "tuple" - }, - { - "components": [ - { - "internalType": "uint256", - "name": "stake", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "unstakeDelaySec", - "type": "uint256" - } - ], - "internalType": "struct IStakeManager.StakeInfo", - "name": "factoryInfo", - "type": "tuple" - }, - { - "components": [ - { - "internalType": "uint256", - "name": "stake", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "unstakeDelaySec", - "type": "uint256" - } - ], - "internalType": "struct IStakeManager.StakeInfo", - "name": "paymasterInfo", - "type": "tuple" - } - ], - "name": "ValidationResult", - "type": "error" - }, - { - "inputs": [ - { - "components": [ - { - "internalType": "uint256", - "name": "preOpGas", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "prefund", - "type": "uint256" - }, - { - "internalType": "bool", - "name": "sigFailed", - "type": "bool" - }, - { - "internalType": "uint48", - "name": "validAfter", - "type": "uint48" - }, - { - "internalType": "uint48", - "name": "validUntil", - "type": "uint48" - }, - { - "internalType": "bytes", - "name": "paymasterContext", - "type": "bytes" - } - ], - "internalType": "struct IEntryPoint.ReturnInfo", - "name": "returnInfo", - "type": "tuple" - }, - { - "components": [ - { - "internalType": "uint256", - "name": "stake", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "unstakeDelaySec", - "type": "uint256" - } - ], - "internalType": "struct IStakeManager.StakeInfo", - "name": "senderInfo", - "type": "tuple" - }, - { - "components": [ - { - "internalType": "uint256", - "name": "stake", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "unstakeDelaySec", - "type": "uint256" - } - ], - "internalType": "struct IStakeManager.StakeInfo", - "name": "factoryInfo", - "type": "tuple" - }, - { - "components": [ - { - "internalType": "uint256", - "name": "stake", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "unstakeDelaySec", - "type": "uint256" - } - ], - "internalType": "struct IStakeManager.StakeInfo", - "name": "paymasterInfo", - "type": "tuple" - }, - { - "components": [ - { - "internalType": "address", - "name": "aggregator", - "type": "address" - }, - { - "components": [ - { - "internalType": "uint256", - "name": "stake", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "unstakeDelaySec", - "type": "uint256" - } - ], - "internalType": "struct IStakeManager.StakeInfo", - "name": "stakeInfo", - "type": "tuple" - } - ], - "internalType": "struct IEntryPoint.AggregatorStakeInfo", - "name": "aggregatorInfo", - "type": "tuple" - } - ], - "name": "ValidationResultWithAggregation", - "type": "error" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "bytes32", - "name": "userOpHash", - "type": "bytes32" - }, - { - "indexed": true, - "internalType": "address", - "name": "sender", - "type": "address" - }, - { - "indexed": false, - "internalType": "address", - "name": "factory", - "type": "address" - }, - { - "indexed": false, - "internalType": "address", - "name": "paymaster", - "type": "address" - } - ], - "name": "AccountDeployed", - "type": "event" - }, - { - "anonymous": false, - "inputs": [], - "name": "BeforeExecution", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "account", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "totalDeposit", - "type": "uint256" - } - ], - "name": "Deposited", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "aggregator", - "type": "address" - } - ], - "name": "SignatureAggregatorChanged", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "account", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "totalStaked", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "unstakeDelaySec", - "type": "uint256" - } - ], - "name": "StakeLocked", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "account", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "withdrawTime", - "type": "uint256" - } - ], - "name": "StakeUnlocked", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "account", - "type": "address" - }, - { - "indexed": false, - "internalType": "address", - "name": "withdrawAddress", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "name": "StakeWithdrawn", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "bytes32", - "name": "userOpHash", - "type": "bytes32" - }, - { - "indexed": true, - "internalType": "address", - "name": "sender", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "paymaster", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "nonce", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "bool", - "name": "success", - "type": "bool" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "actualGasCost", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "actualGasUsed", - "type": "uint256" - } - ], - "name": "UserOperationEvent", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "bytes32", - "name": "userOpHash", - "type": "bytes32" - }, - { - "indexed": true, - "internalType": "address", - "name": "sender", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "nonce", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "bytes", - "name": "revertReason", - "type": "bytes" - } - ], - "name": "UserOperationRevertReason", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "account", - "type": "address" - }, - { - "indexed": false, - "internalType": "address", - "name": "withdrawAddress", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "name": "Withdrawn", - "type": "event" - }, - { - "inputs": [], - "name": "SIG_VALIDATION_FAILED", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes", - "name": "initCode", - "type": "bytes" - }, - { - "internalType": "address", - "name": "sender", - "type": "address" - }, - { - "internalType": "bytes", - "name": "paymasterAndData", - "type": "bytes" - } - ], - "name": "_validateSenderAndPaymaster", - "outputs": [], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint32", - "name": "unstakeDelaySec", - "type": "uint32" - } - ], - "name": "addStake", - "outputs": [], - "stateMutability": "payable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "account", - "type": "address" - } - ], - "name": "balanceOf", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "account", - "type": "address" - } - ], - "name": "depositTo", - "outputs": [], - "stateMutability": "payable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "name": "deposits", - "outputs": [ - { - "internalType": "uint112", - "name": "deposit", - "type": "uint112" - }, - { - "internalType": "bool", - "name": "staked", - "type": "bool" - }, - { - "internalType": "uint112", - "name": "stake", - "type": "uint112" - }, - { - "internalType": "uint32", - "name": "unstakeDelaySec", - "type": "uint32" - }, - { - "internalType": "uint48", - "name": "withdrawTime", - "type": "uint48" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "account", - "type": "address" - } - ], - "name": "getDepositInfo", - "outputs": [ - { - "components": [ - { - "internalType": "uint112", - "name": "deposit", - "type": "uint112" - }, - { - "internalType": "bool", - "name": "staked", - "type": "bool" - }, - { - "internalType": "uint112", - "name": "stake", - "type": "uint112" - }, - { - "internalType": "uint32", - "name": "unstakeDelaySec", - "type": "uint32" - }, - { - "internalType": "uint48", - "name": "withdrawTime", - "type": "uint48" - } - ], - "internalType": "struct IStakeManager.DepositInfo", - "name": "info", - "type": "tuple" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "sender", - "type": "address" - }, - { - "internalType": "uint192", - "name": "key", - "type": "uint192" - } - ], - "name": "getNonce", - "outputs": [ - { - "internalType": "uint256", - "name": "nonce", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes", - "name": "initCode", - "type": "bytes" - } - ], - "name": "getSenderAddress", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "components": [ - { - "internalType": "address", - "name": "sender", - "type": "address" - }, - { - "internalType": "uint256", - "name": "nonce", - "type": "uint256" - }, - { - "internalType": "bytes", - "name": "initCode", - "type": "bytes" - }, - { - "internalType": "bytes", - "name": "callData", - "type": "bytes" - }, - { - "internalType": "uint256", - "name": "callGasLimit", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "verificationGasLimit", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "preVerificationGas", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "maxFeePerGas", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "maxPriorityFeePerGas", - "type": "uint256" - }, - { - "internalType": "bytes", - "name": "paymasterAndData", - "type": "bytes" - }, - { - "internalType": "bytes", - "name": "signature", - "type": "bytes" - } - ], - "internalType": "struct UserOperation", - "name": "userOp", - "type": "tuple" - } - ], - "name": "getUserOpHash", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "components": [ - { - "components": [ - { - "internalType": "address", - "name": "sender", - "type": "address" - }, - { - "internalType": "uint256", - "name": "nonce", - "type": "uint256" - }, - { - "internalType": "bytes", - "name": "initCode", - "type": "bytes" - }, - { - "internalType": "bytes", - "name": "callData", - "type": "bytes" - }, - { - "internalType": "uint256", - "name": "callGasLimit", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "verificationGasLimit", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "preVerificationGas", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "maxFeePerGas", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "maxPriorityFeePerGas", - "type": "uint256" - }, - { - "internalType": "bytes", - "name": "paymasterAndData", - "type": "bytes" - }, - { - "internalType": "bytes", - "name": "signature", - "type": "bytes" - } - ], - "internalType": "struct UserOperation[]", - "name": "userOps", - "type": "tuple[]" - }, - { - "internalType": "contract IAggregator", - "name": "aggregator", - "type": "address" - }, - { - "internalType": "bytes", - "name": "signature", - "type": "bytes" - } - ], - "internalType": "struct IEntryPoint.UserOpsPerAggregator[]", - "name": "opsPerAggregator", - "type": "tuple[]" - }, - { - "internalType": "address payable", - "name": "beneficiary", - "type": "address" - } - ], - "name": "handleAggregatedOps", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "components": [ - { - "internalType": "address", - "name": "sender", - "type": "address" - }, - { - "internalType": "uint256", - "name": "nonce", - "type": "uint256" - }, - { - "internalType": "bytes", - "name": "initCode", - "type": "bytes" - }, - { - "internalType": "bytes", - "name": "callData", - "type": "bytes" - }, - { - "internalType": "uint256", - "name": "callGasLimit", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "verificationGasLimit", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "preVerificationGas", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "maxFeePerGas", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "maxPriorityFeePerGas", - "type": "uint256" - }, - { - "internalType": "bytes", - "name": "paymasterAndData", - "type": "bytes" - }, - { - "internalType": "bytes", - "name": "signature", - "type": "bytes" - } - ], - "internalType": "struct UserOperation[]", - "name": "ops", - "type": "tuple[]" - }, - { - "internalType": "address payable", - "name": "beneficiary", - "type": "address" - } - ], - "name": "handleOps", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint192", - "name": "key", - "type": "uint192" - } - ], - "name": "incrementNonce", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes", - "name": "callData", - "type": "bytes" - }, - { - "components": [ - { - "components": [ - { - "internalType": "address", - "name": "sender", - "type": "address" - }, - { - "internalType": "uint256", - "name": "nonce", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "callGasLimit", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "verificationGasLimit", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "preVerificationGas", - "type": "uint256" - }, - { - "internalType": "address", - "name": "paymaster", - "type": "address" - }, - { - "internalType": "uint256", - "name": "maxFeePerGas", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "maxPriorityFeePerGas", - "type": "uint256" - } - ], - "internalType": "struct EntryPoint.MemoryUserOp", - "name": "mUserOp", - "type": "tuple" - }, - { - "internalType": "bytes32", - "name": "userOpHash", - "type": "bytes32" - }, - { - "internalType": "uint256", - "name": "prefund", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "contextOffset", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "preOpGas", - "type": "uint256" - } - ], - "internalType": "struct EntryPoint.UserOpInfo", - "name": "opInfo", - "type": "tuple" - }, - { - "internalType": "bytes", - "name": "context", - "type": "bytes" - } - ], - "name": "innerHandleOp", - "outputs": [ - { - "internalType": "uint256", - "name": "actualGasCost", - "type": "uint256" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - }, - { - "internalType": "uint192", - "name": "", - "type": "uint192" - } - ], - "name": "nonceSequenceNumber", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "components": [ - { - "internalType": "address", - "name": "sender", - "type": "address" - }, - { - "internalType": "uint256", - "name": "nonce", - "type": "uint256" - }, - { - "internalType": "bytes", - "name": "initCode", - "type": "bytes" - }, - { - "internalType": "bytes", - "name": "callData", - "type": "bytes" - }, - { - "internalType": "uint256", - "name": "callGasLimit", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "verificationGasLimit", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "preVerificationGas", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "maxFeePerGas", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "maxPriorityFeePerGas", - "type": "uint256" - }, - { - "internalType": "bytes", - "name": "paymasterAndData", - "type": "bytes" - }, - { - "internalType": "bytes", - "name": "signature", - "type": "bytes" - } - ], - "internalType": "struct UserOperation", - "name": "op", - "type": "tuple" - }, - { - "internalType": "address", - "name": "target", - "type": "address" - }, - { - "internalType": "bytes", - "name": "targetCallData", - "type": "bytes" - } - ], - "name": "simulateHandleOp", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "components": [ - { - "internalType": "address", - "name": "sender", - "type": "address" - }, - { - "internalType": "uint256", - "name": "nonce", - "type": "uint256" - }, - { - "internalType": "bytes", - "name": "initCode", - "type": "bytes" - }, - { - "internalType": "bytes", - "name": "callData", - "type": "bytes" - }, - { - "internalType": "uint256", - "name": "callGasLimit", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "verificationGasLimit", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "preVerificationGas", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "maxFeePerGas", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "maxPriorityFeePerGas", - "type": "uint256" - }, - { - "internalType": "bytes", - "name": "paymasterAndData", - "type": "bytes" - }, - { - "internalType": "bytes", - "name": "signature", - "type": "bytes" - } - ], - "internalType": "struct UserOperation", - "name": "userOp", - "type": "tuple" - } - ], - "name": "simulateValidation", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "unlockStake", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address payable", - "name": "withdrawAddress", - "type": "address" - } - ], - "name": "withdrawStake", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address payable", - "name": "withdrawAddress", - "type": "address" - }, - { - "internalType": "uint256", - "name": "withdrawAmount", - "type": "uint256" - } - ], - "name": "withdrawTo", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "stateMutability": "payable", - "type": "receive" - } - ], - "bytecode": "0x60a080604052346200008957600160025561022c8181016001600160401b038111838210176200007357829162005d18833903906000f080156200006757608052604051615c8990816200008f82396080518181816113df01528181613e9501526141b60152f35b6040513d6000823e3d90fd5b634e487b7160e01b600052604160045260246000fd5b600080fdfe60806040526004361015610023575b361561001957600080fd5b610021615531565b005b60003560e01c80630396cb60146101b35780630bd28e3b146101aa5780631b2e01b8146101a15780631d732756146101985780631fad948c1461018f578063205c28781461018657806335567e1a1461017d5780634b1d7cf5146101745780635287ce121461016b57806370a08231146101625780638f41ec5a14610159578063957122ab146101505780639b249f6914610147578063a61935311461013e578063b760faf914610135578063bb9fe6bf1461012c578063c23a5cea14610123578063d6383f941461011a578063ee219423146101115763fc7e286d0361000e5761010c611bcd565b61000e565b5061010c6119b5565b5061010c61184d565b5061010c6116b4565b5061010c611536565b5061010c6114f7565b5061010c6114d6565b5061010c611337565b5061010c611164565b5061010c611129565b5061010c6110a4565b5061010c610f54565b5061010c610bf8565b5061010c610b33565b5061010c610994565b5061010c6108ba565b5061010c6106e7565b5061010c610467565b5061010c610385565b5060207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595760043563ffffffff8116808203610359576103547fa5ae833d0bb1dcd632d98a8b70973e8516812898e19bf27b70071ebc8dc52c01916102716102413373ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b9161024d811515615697565b61026a610261600185015463ffffffff1690565b63ffffffff1690565b11156156fc565b54926103366dffffffffffffffffffffffffffff946102f461029834888460781c166121d5565b966102a4881515615761565b6102b0818911156157c6565b6102d4816102bc6105ec565b941684906dffffffffffffffffffffffffffff169052565b6001602084015287166dffffffffffffffffffffffffffff166040830152565b63ffffffff83166060820152600060808201526103313373ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b61582b565b6040805194855263ffffffff90911660208501523393918291820190565b0390a2005b600080fd5b6024359077ffffffffffffffffffffffffffffffffffffffffffffffff8216820361035957565b50346103595760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595760043577ffffffffffffffffffffffffffffffffffffffffffffffff81168103610359576104149033600052600160205260406000209077ffffffffffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b61041e8154612491565b9055005b73ffffffffffffffffffffffffffffffffffffffff81160361035957565b6024359061044d82610422565b565b60c4359061044d82610422565b359061044d82610422565b50346103595760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595760206104fc6004356104a881610422565b73ffffffffffffffffffffffffffffffffffffffff6104c561035e565b91166000526001835260406000209077ffffffffffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b54604051908152f35b507f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60a0810190811067ffffffffffffffff82111761055157604052565b610559610505565b604052565b610100810190811067ffffffffffffffff82111761055157604052565b67ffffffffffffffff811161055157604052565b6060810190811067ffffffffffffffff82111761055157604052565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761055157604052565b6040519061044d82610535565b6040519060c0820182811067ffffffffffffffff82111761055157604052565b604051906040820182811067ffffffffffffffff82111761055157604052565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f60209267ffffffffffffffff8111610675575b01160190565b61067d610505565b61066f565b92919261068e82610639565b9161069c60405193846105ab565b829481845281830111610359578281602093846000960137010152565b9181601f840112156103595782359167ffffffffffffffff8311610359576020838186019501011161035957565b5034610359576101c07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595767ffffffffffffffff60043581811161035957366023820112156103595761074a903690602481600401359101610682565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc36016101808112610359576101006040519161078783610535565b12610359576040516107988161055e565b6107a0610440565b815260443560208201526064356040820152608435606082015260a43560808201526107ca61044f565b60a082015260e43560c08201526101043560e082015281526101243560208201526101443560408201526101643560608201526101843560808201526101a4359182116103595761083e9261082661082e9336906004016106b9565b9290916128b1565b6040519081529081906020820190565b0390f35b9060407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8301126103595760043567ffffffffffffffff9283821161035957806023830112156103595781600401359384116103595760248460051b830101116103595760240191906024356108b781610422565b90565b5034610359576108c936610842565b6108d4929192611e3a565b6108dd83611d2d565b60005b84811061095d57506000927fbb47ee3e183a558b1a2ff0874b079f3fc5478b7454eacf2bfc5af2ff5878f9728480a183915b85831061092d576109238585611ed7565b6100216001600255565b909193600190610953610941878987611dec565b61094b8886611dca565b51908861233f565b0194019190610912565b8061098b610984610972600194869896611dca565b5161097e848a88611dec565b84613448565b9083612f30565b019290926108e0565b50346103595760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610359576004356109d081610422565b6024359060009133835282602052604083206dffffffffffffffffffffffffffff81541692838311610ad557848373ffffffffffffffffffffffffffffffffffffffff829593610a788496610a3f610a2c8798610ad29c6121c0565b6dffffffffffffffffffffffffffff1690565b6dffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffff0000000000000000000000000000825416179055565b6040805173ffffffffffffffffffffffffffffffffffffffff831681526020810185905233917fd1c19fbcd4551a5edfb66d43d2e337c04837afda3482b42bdf569a8fccdae5fb91a2165af1610acc611ea7565b50615ba2565b80f35b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f576974686472617720616d6f756e7420746f6f206c61726765000000000000006044820152fd5b50346103595760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610359576020600435610b7181610422565b73ffffffffffffffffffffffffffffffffffffffff610b8e61035e565b911660005260018252610bc98160406000209077ffffffffffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000006040519260401b16178152f35b503461035957610c0736610842565b610c0f611e3a565b6000805b838210610df657610c249150611d2d565b7fbb47ee3e183a558b1a2ff0874b079f3fc5478b7454eacf2bfc5af2ff5878f972600080a16000805b848110610d5c57505060008093815b818110610c9357610923868660007f575ff3acadd5ab348fe1855e217e0f3678f8d767d7494c9f9fefbee2e17cca4d8180a2611ed7565b610cf7610ca182848a6124cb565b610ccc610cb3610cb36020840161256d565b73ffffffffffffffffffffffffffffffffffffffff1690565b7f575ff3acadd5ab348fe1855e217e0f3678f8d767d7494c9f9fefbee2e17cca4d600080a280612519565b906000915b808310610d1457505050610d0f90612491565b610c5c565b90919497610d4f610d49610d5592610d438c8b610d3c82610d368e8b8d611dec565b92611dca565b519161233f565b906121d5565b99612491565b95612491565b9190610cfc565b610d678186886124cb565b6020610d7f610d768380612519565b9290930161256d565b9173ffffffffffffffffffffffffffffffffffffffff60009316905b828410610db45750505050610daf90612491565b610c4d565b90919294610d4f81610de985610de2610dd0610dee968d611dca565b51610ddc8c8b8a611dec565b85613448565b908b613148565b612491565b929190610d9b565b610e018285876124cb565b90610e0c8280612519565b92610e1c610cb36020830161256d565b9173ffffffffffffffffffffffffffffffffffffffff8316610e416001821415612577565b610e62575b505050610e5c91610e56916121d5565b91612491565b90610c13565b909592610e7b6040999693999895989788810190611fc8565b92908a3b156103595789938b918a5193849283927fe3563a4f00000000000000000000000000000000000000000000000000000000845260049e8f850193610ec294612711565b03815a93600094fa9081610f3b575b50610f255786517f86a9f75000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8a16818a0190815281906020010390fd5b0390fd5b9497509295509093509181610e56610e5c610e46565b80610f48610f4e9261057b565b8061111e565b38610ed1565b50346103595760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595761083e73ffffffffffffffffffffffffffffffffffffffff600435610fa881610422565b608060409283928351610fba81610535565b60009381858093528260208201528287820152826060820152015216815280602052209061104965ffffffffffff6001835194610ff686610535565b80546dffffffffffffffffffffffffffff8082168852607082901c60ff161515602089015260789190911c1685870152015463ffffffff8116606086015260201c16608084019065ffffffffffff169052565b5191829182919091608065ffffffffffff8160a08401956dffffffffffffffffffffffffffff808251168652602082015115156020870152604082015116604086015263ffffffff6060820151166060860152015116910152565b50346103595760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595773ffffffffffffffffffffffffffffffffffffffff6004356110f581610422565b16600052600060205260206dffffffffffffffffffffffffffff60406000205416604051908152f35b600091031261035957565b50346103595760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261035957602060405160018152f35b50346103595760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261035957600467ffffffffffffffff8135818111610359576111b590369084016106b9565b9050602435916111c483610422565b604435908111610359576111db90369085016106b9565b92909115908161132d575b506112c6576014821015611236575b610f21836040519182917f08c379a0000000000000000000000000000000000000000000000000000000008352820160409060208152600060208201520190565b6112466112529261124c92612b88565b90612b96565b60601c90565b3b1561125f5738806111f5565b610f21906040519182917f08c379a0000000000000000000000000000000000000000000000000000000008352820160609060208152601b60208201527f41413330207061796d6173746572206e6f74206465706c6f796564000000000060408201520190565b610f21836040519182917f08c379a0000000000000000000000000000000000000000000000000000000008352820160609060208152601960208201527f41413230206163636f756e74206e6f74206465706c6f7965640000000000000060408201520190565b90503b15386111e6565b50346103595760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595760043567ffffffffffffffff81116103595761138960249136906004016106b9565b906113bf6040519283927f570e1a3600000000000000000000000000000000000000000000000000000000845260048401612d2c565b0360208273ffffffffffffffffffffffffffffffffffffffff92816000857f0000000000000000000000000000000000000000000000000000000000000000165af1918215611471575b600092611441575b50604051917f6ca7b806000000000000000000000000000000000000000000000000000000008352166004820152fd5b61146391925060203d811161146a575b61145b81836105ab565b810190612d17565b9038611411565b503d611451565b611479612183565b611409565b90816101609103126103595790565b60207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc820112610359576004359067ffffffffffffffff8211610359576108b79160040161147e565b50346103595760206114ef6114ea3661148d565b612a0c565b604051908152f35b5060207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595761002160043561153181610422565b61562b565b5034610359576000807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126116b1573381528060205260408120600181019063ffffffff825416908115611653576115f06115b5611618936115a76115a2855460ff9060701c1690565b61598f565b65ffffffffffff42166159f4565b84547fffffffffffffffffffffffffffffffffffffffffffff000000000000ffffffff16602082901b69ffffffffffff000000001617909455565b7fffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffff8154169055565b60405165ffffffffffff91909116815233907ffa9b3c14cc825c412c9ed81b3ba365a5b459439403f18829e572ed53a4180f0a90602090a280f35b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f6e6f74207374616b6564000000000000000000000000000000000000000000006044820152fd5b80fd5b50346103595760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610359576004356116f081610422565b610ad273ffffffffffffffffffffffffffffffffffffffff6117323373ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b926117ea611755610a2c86546dffffffffffffffffffffffffffff9060781c1690565b94611761861515615a0e565b6117c26001820161179a65ffffffffffff611786835465ffffffffffff9060201c1690565b16611792811515615a73565b421015615ad8565b80547fffffffffffffffffffffffffffffffffffffffffffff00000000000000000000169055565b7fffffff0000000000000000000000000000ffffffffffffffffffffffffffffff8154169055565b6040805173ffffffffffffffffffffffffffffffffffffffff831681526020810186905233917fb7c918e0e249f999e965cafeb6c664271b3f4317d296461500e71da39f0cbda391a2600080809581948294165af1611847611ea7565b50615b3d565b50346103595760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595767ffffffffffffffff6004358181116103595761189e90369060040161147e565b602435916118ab83610422565b604435908111610359576118c6610f219136906004016106b9565b6118ce611caa565b6118d785612e2b565b6118ea6118e48287613240565b906153ba565b946118fa826000924384526121e2565b96438252819360609573ffffffffffffffffffffffffffffffffffffffff8316611981575b50505050608001519361194e6040611940602084015165ffffffffffff1690565b92015165ffffffffffff1690565b906040519687967f8b7ac980000000000000000000000000000000000000000000000000000000008852600488016127e1565b8395508394965061199b60409492939451809481936127d3565b03925af19060806119aa611ea7565b92919038808061191f565b5034610359576119c43661148d565b6119cc611caa565b6119d582612e2b565b6119df8183613240565b825160a00151919391611a0c9073ffffffffffffffffffffffffffffffffffffffff166154dc565b6154dc565b90611a30611a07855173ffffffffffffffffffffffffffffffffffffffff90511690565b94611a39612b50565b50611a68611a4c60409586810190611fc8565b90600060148310611bc55750611246611a079261124c92612b88565b91611a72916153ba565b805173ffffffffffffffffffffffffffffffffffffffff169073ffffffffffffffffffffffffffffffffffffffff821660018114916080880151978781015191886020820151611ac79065ffffffffffff1690565b91015165ffffffffffff16916060015192611ae06105f9565b9a8b5260208b0152841515898b015265ffffffffffff1660608a015265ffffffffffff16608089015260a088015215159081611bbc575b50611b515750610f2192519485947fe0cff05f00000000000000000000000000000000000000000000000000000000865260048601612cbd565b9190610f2193611b60846154dc565b611b87611b6b610619565b73ffffffffffffffffffffffffffffffffffffffff9096168652565b6020850152519586957ffaecb4e400000000000000000000000000000000000000000000000000000000875260048701612c2b565b90501538611b17565b9150506154dc565b50346103595760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595773ffffffffffffffffffffffffffffffffffffffff600435611c1e81610422565b16600052600060205260a0604060002065ffffffffffff60018254920154604051926dffffffffffffffffffffffffffff90818116855260ff8160701c161515602086015260781c16604084015263ffffffff8116606084015260201c166080820152f35b60209067ffffffffffffffff8111611c9d575b60051b0190565b611ca5610505565b611c96565b60405190611cb782610535565b604051608083610100830167ffffffffffffffff811184821017611d20575b60405260009283815283602082015283604082015283606082015283838201528360a08201528360c08201528360e082015281528260208201528260408201528260608201520152565b611d28610505565b611cd6565b90611d3782611c83565b611d4460405191826105ab565b8281527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0611d728294611c83565b019060005b828110611d8357505050565b602090611d8e611caa565b82828501015201611d77565b507f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020918151811015611ddf575b60051b010190565b611de7611d9a565b611dd7565b9190811015611e2d575b60051b810135907ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffea181360301821215610359570190565b611e35611d9a565b611df6565b6002805414611e495760028055565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152fd5b3d15611ed2573d90611eb882610639565b91611ec660405193846105ab565b82523d6000602084013e565b606090565b73ffffffffffffffffffffffffffffffffffffffff168015611f6a57600080809381935af1611f04611ea7565b5015611f0c57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f41413931206661696c65642073656e6420746f2062656e6566696369617279006044820152fd5b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f4141393020696e76616c69642062656e656669636961727900000000000000006044820152fd5b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610359570180359067ffffffffffffffff82116103595760200191813603831361035957565b90816020910312610359575190565b601f82602094937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0938186528686013760008582860101520116010190565b60005b83811061207a5750506000910152565b818101518382015260200161206a565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f6020936120c681518092818752878088019101612067565b0116010190565b906120e76080916108b796946101c0808652850191612028565b9360e0815173ffffffffffffffffffffffffffffffffffffffff80825116602087015260208201516040870152604082015160608701526060820151858701528482015160a087015260a08201511660c086015260c081015182860152015161010084015260208101516101208401526040810151610140840152606081015161016084015201516101808201526101a081840391015261208a565b506040513d6000823e3d90fd5b507f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b919082039182116121cd57565b61044d612190565b919082018092116121cd57565b905a918160206121fb6060830151936060810190611fc8565b906122348560405195869485947f1d732756000000000000000000000000000000000000000000000000000000008652600486016120cd565b03816000305af16000918161230f575b50612308575060206000803e7fdeaddead000000000000000000000000000000000000000000000000000000006000511461229b5761229561228a6108b7945a906121c0565b6080840151906121d5565b91614afc565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152600f60408201527f41413935206f7574206f6620676173000000000000000000000000000000000060608201520190565b9250505090565b61233191925060203d8111612338575b61232981836105ab565b810190612019565b9038612244565b503d61231f565b909291925a9380602061235b6060830151946060810190611fc8565b906123948660405195869485947f1d732756000000000000000000000000000000000000000000000000000000008652600486016120cd565b03816000305af160009181612471575b5061246a575060206000803e7fdeaddead00000000000000000000000000000000000000000000000000000000600051146123fc576123f66123eb6108b795965a906121c0565b6080830151906121d5565b92614ddf565b610f21836040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152600f60408201527f41413935206f7574206f6620676173000000000000000000000000000000000060608201520190565b9450505050565b61248a91925060203d81116123385761232981836105ab565b90386123a4565b6001907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146124bf570190565b6124c7612190565b0190565b919081101561250c575b60051b810135907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa181360301821215610359570190565b612514611d9a565b6124d5565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610359570180359067ffffffffffffffff821161035957602001918160051b3603831361035957565b356108b781610422565b1561257e57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4141393620696e76616c69642061676772656761746f720000000000000000006044820152fd5b90357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18236030181121561035957016020813591019167ffffffffffffffff821161035957813603831361035957565b6108b7916126578161263d8461045c565b73ffffffffffffffffffffffffffffffffffffffff169052565b602082013560208201526126f26126a361268861267760408601866125dc565b610160806040880152860191612028565b61269560608601866125dc565b908583036060870152612028565b6080840135608084015260a084013560a084015260c084013560c084015260e084013560e084015261010080850135908401526101206126e5818601866125dc565b9185840390860152612028565b9161270361014091828101906125dc565b929091818503910152612028565b949391929083604087016040885252606086019360608160051b8801019482600090815b848310612754575050505050508460206108b795968503910152612028565b9091929394977fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa08b820301855288357ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffea1843603018112156127cf57600191846127bd920161262c565b98602090810196950193019190612735565b8280fd5b908092918237016000815290565b9290936108b796959260c0958552602085015265ffffffffffff8092166040850152166060830152151560808201528160a0820152019061208a565b1561282457565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4141393220696e7465726e616c2063616c6c206f6e6c790000000000000000006044820152fd5b9060406108b79260008152816020820152019061208a565b6040906108b793928152816020820152019061208a565b909291925a936128c230331461281d565b8151946040860151955a6113886060830151890101116129e2576108b7966000958051612909575b50505090612903915a9003608084015101943691610682565b91615047565b612938916129349161292f855173ffffffffffffffffffffffffffffffffffffffff1690565b615c12565b1590565b612944575b80806128ea565b61290392919450612953615c24565b908151612967575b5050600193909161293d565b7f1c4fada7374c0a9ee8841fc38afe82932dc0f8e69012e927f061a8bae611a20173ffffffffffffffffffffffffffffffffffffffff6020870151926129d860206129c6835173ffffffffffffffffffffffffffffffffffffffff1690565b9201519560405193849316968361289a565b0390a3388061295b565b7fdeaddead0000000000000000000000000000000000000000000000000000000060005260206000fd5b612a22612a1c6040830183611fc8565b90615c07565b90612a33612a1c6060830183611fc8565b90612ae9612a48612a1c610120840184611fc8565b60405194859360208501956101008201359260e08301359260c08101359260a08201359260808301359273ffffffffffffffffffffffffffffffffffffffff60208201359135168c9693909a9998959261012098959273ffffffffffffffffffffffffffffffffffffffff6101408a019d168952602089015260408801526060870152608086015260a085015260c084015260e08301526101008201520152565b0391612b1b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0938481018352826105ab565b51902060408051602081019283523091810191909152466060820152608092830181529091612b4a90826105ab565b51902090565b604051906040820182811067ffffffffffffffff821117612b7b575b60405260006020838281520152565b612b83610505565b612b6c565b906014116103595790601490565b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000009035818116939260148110612bcb57505050565b60140360031b82901b16169150565b9060c060a06108b793805184526020810151602085015260408101511515604085015265ffffffffffff80606083015116606086015260808201511660808501520151918160a0820152019061208a565b9294612c8c61044d95612c7a610100959998612c68612c54602097610140808c528b0190612bda565b9b878a019060208091805184520151910152565b80516060890152602001516080880152565b805160a08701526020015160c0860152565b73ffffffffffffffffffffffffffffffffffffffff81511660e0850152015191019060208091805184520151910152565b612d0661044d94612cf4612cdf60a0959998969960e0865260e0860190612bda565b98602085019060208091805184520151910152565b80516060840152602001516080830152565b019060208091805184520151910152565b9081602091031261035957516108b781610422565b9160206108b7938181520191612028565b90612d6c73ffffffffffffffffffffffffffffffffffffffff916108b797959694606085526060850191612028565b941660208201526040818503910152612028565b60009060033d11612d8d57565b905060046000803e60005160e01c90565b600060443d106108b7576040517ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc91823d016004833e815167ffffffffffffffff918282113d602484011117612e1a57818401948551938411612e22573d85010160208487010111612e1a57506108b7929101602001906105ab565b949350505050565b50949350505050565b612e386040820182611fc8565b612e50612e448461256d565b93610120810190611fc8565b9290303b1561035957600093612e949160405196879586957f957122ab00000000000000000000000000000000000000000000000000000000875260048701612d3d565b0381305afa9081612f1d575b5061044d576001612eaf612d80565b6308c379a014612ec8575b612ec057565b61044d612183565b612ed0612d9e565b80612edc575b50612eba565b80516000925015612ed657610f21906040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301612882565b80610f48612f2a9261057b565b38612ea0565b9190612f3b9061317f565b73ffffffffffffffffffffffffffffffffffffffff929183166130da5761306c57612f659061317f565b9116612ffe57612f725750565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152602160448201527f41413332207061796d61737465722065787069726564206f72206e6f7420647560648201527f6500000000000000000000000000000000000000000000000000000000000000608482015260a490fd5b610f21826040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601460408201527f41413334207369676e6174757265206572726f7200000000000000000000000060608201520190565b610f21836040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601760408201527f414132322065787069726564206f72206e6f742064756500000000000000000060608201520190565b610f21846040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601460408201527f41413234207369676e6174757265206572726f7200000000000000000000000060608201520190565b9291906131549061317f565b909273ffffffffffffffffffffffffffffffffffffffff808095169116036130da5761306c57612f65905b80156131d25761318e9061535f565b73ffffffffffffffffffffffffffffffffffffffff65ffffffffffff8060408401511642119081156131c2575b5091511691565b90506020830151164210386131bb565b50600090600090565b156131e257565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f41413934206761732076616c756573206f766572666c6f7700000000000000006044820152fd5b916000915a9381519061325382826136b3565b61325c81612a0c565b602084015261329a6effffffffffffffffffffffffffffff60808401516060850151176040850151176101008401359060e0850135171711156131db565b6132a382613775565b6132ae818584613836565b97906132df6129346132d4875173ffffffffffffffffffffffffffffffffffffffff1690565b60208801519061546c565b6133db576132ec43600052565b73ffffffffffffffffffffffffffffffffffffffff61332460a0606097015173ffffffffffffffffffffffffffffffffffffffff1690565b166133c1575b505a810360a0840135106133545760809360c092604087015260608601525a900391013501910152565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601e60408201527f41413430206f76657220766572696669636174696f6e4761734c696d6974000060608201520190565b909350816133d2929750858461455c565b9590923861332a565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601a60408201527f4141323520696e76616c6964206163636f756e74206e6f6e636500000000000060608201520190565b9290916000925a825161345b81846136b3565b61346483612a0c565b60208501526134a26effffffffffffffffffffffffffffff60808301516060840151176040840151176101008601359060e0870135171711156131db565b6134ab81613775565b6134b78186868b613ba2565b98906134e86129346134dd865173ffffffffffffffffffffffffffffffffffffffff1690565b60208701519061546c565b6135e0576134f543600052565b73ffffffffffffffffffffffffffffffffffffffff61352d60a0606096015173ffffffffffffffffffffffffffffffffffffffff1690565b166135c5575b505a840360a08601351061355f5750604085015260608401526080919060c0905a900391013501910152565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152601e60448201527f41413430206f76657220766572696669636174696f6e4761734c696d697400006064820152608490fd5b909250816135d79298508686856147ef565b96909138613533565b610f21826040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601a60408201527f4141323520696e76616c6964206163636f756e74206e6f6e636500000000000060608201520190565b1561365557565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f4141393320696e76616c6964207061796d6173746572416e64446174610000006044820152fd5b613725906136dd6136c38261256d565b73ffffffffffffffffffffffffffffffffffffffff168452565b602081013560208401526080810135604084015260a0810135606084015260c0810135608084015260e081013560c084015261010081013560e0840152610120810190611fc8565b90811561376a5761374f61124c6112468460a09461374a601461044d9998101561364e565b612b88565b73ffffffffffffffffffffffffffffffffffffffff16910152565b505060a06000910152565b60a081015173ffffffffffffffffffffffffffffffffffffffff16156137b75760c060035b60ff60408401519116606084015102016080830151019101510290565b60c0600161379a565b6137d86040929594939560608352606083019061262c565b9460208201520152565b9061044d602f60405180947f414132332072657665727465643a20000000000000000000000000000000000060208301526138268151809260208686019101612067565b810103600f8101855201836105ab565b916000926000925a936139046020835193613865855173ffffffffffffffffffffffffffffffffffffffff1690565b9561387d6138766040830183611fc8565b9084613e0d565b60a086015173ffffffffffffffffffffffffffffffffffffffff16906138a243600052565b85809373ffffffffffffffffffffffffffffffffffffffff809416159889613b3a575b60600151908601516040517f3a871cdd0000000000000000000000000000000000000000000000000000000081529788968795869390600485016137c0565b03938a1690f1829181613b1a575b50613b115750600190613923612d80565b6308c379a014613abd575b50613a50575b613941575b50505a900391565b61396b9073ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b613986610a2c82546dffffffffffffffffffffffffffff1690565b8083116139e3576139dc926dffffffffffffffffffffffffffff9103166dffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffff0000000000000000000000000000825416179055565b3880613939565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601760408201527f41413231206469646e2774207061792070726566756e6400000000000000000060608201520190565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601660408201527f4141323320726576657274656420286f72204f4f47290000000000000000000060608201520190565b613ac5612d9e565b9081613ad1575061392e565b610f2191613adf91506137e2565b6040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301612882565b95506139349050565b613b3391925060203d81116123385761232981836105ab565b9038613912565b9450613b80610a2c613b6c8c73ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b546dffffffffffffffffffffffffffff1690565b8b811115613b975750856060835b969150506138c5565b606087918d03613b8e565b90926000936000935a94613beb6020835193613bd2855173ffffffffffffffffffffffffffffffffffffffff1690565b9561387d613be36040830183611fc8565b90848c61412b565b03938a1690f1829181613ded575b50613de45750600190613c0a612d80565b6308c379a014613d8e575b50613d20575b613c29575b5050505a900391565b613c539073ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b91613c6f610a2c84546dffffffffffffffffffffffffffff1690565b90818311613cba575082547fffffffffffffffffffffffffffffffffffff0000000000000000000000000000169190036dffffffffffffffffffffffffffff16179055388080613c20565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152601760448201527f41413231206469646e2774207061792070726566756e640000000000000000006064820152608490fd5b610f21846040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601660408201527f4141323320726576657274656420286f72204f4f47290000000000000000000060608201520190565b613d96612d9e565b9081613da25750613c15565b8691613dae91506137e2565b90610f216040519283927f220266b60000000000000000000000000000000000000000000000000000000084526004840161289a565b9650613c1b9050565b613e0691925060203d81116123385761232981836105ab565b9038613bf9565b909180613e1957505050565b81515173ffffffffffffffffffffffffffffffffffffffff1692833b6140be57606083510151604051907f570e1a3600000000000000000000000000000000000000000000000000000000825260208280613e78878760048401612d2c565b0381600073ffffffffffffffffffffffffffffffffffffffff95867f00000000000000000000000000000000000000000000000000000000000000001690f19182156140b1575b600092614091575b508082169586156140245716809503613fb7573b15613f4a5761124c6112467fd51a9c61267aa6196961883ecf5ff2da6619c37dac0fa92122513fb32c032d2d93613f1193612b88565b602083810151935160a001516040805173ffffffffffffffffffffffffffffffffffffffff9485168152939091169183019190915290a3565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152602060408201527f4141313520696e6974436f6465206d757374206372656174652073656e64657260608201520190565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152602060408201527f4141313420696e6974436f6465206d7573742072657475726e2073656e64657260608201520190565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601b60408201527f4141313320696e6974436f6465206661696c6564206f72204f4f47000000000060608201520190565b6140aa91925060203d811161146a5761145b81836105ab565b9038613ec7565b6140b9612183565b613ebf565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601f60408201527f414131302073656e64657220616c726561647920636f6e73747275637465640060608201520190565b9290918161413a575b50505050565b82515173ffffffffffffffffffffffffffffffffffffffff1693843b6143e257606084510151604051907f570e1a3600000000000000000000000000000000000000000000000000000000825260208280614199888860048401612d2c565b0381600073ffffffffffffffffffffffffffffffffffffffff95867f00000000000000000000000000000000000000000000000000000000000000001690f19182156143d5575b6000926143b5575b5080821696871561434757168096036142d9573b15614273575061124c6112467fd51a9c61267aa6196961883ecf5ff2da6619c37dac0fa92122513fb32c032d2d9361423393612b88565b602083810151935160a001516040805173ffffffffffffffffffffffffffffffffffffffff9485168152939091169183019190915290a338808080614134565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152602060448201527f4141313520696e6974436f6465206d757374206372656174652073656e6465726064820152608490fd5b610f21826040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152602060408201527f4141313420696e6974436f6465206d7573742072657475726e2073656e64657260608201520190565b610f21846040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601b60408201527f4141313320696e6974436f6465206661696c6564206f72204f4f47000000000060608201520190565b6143ce91925060203d811161146a5761145b81836105ab565b90386141e8565b6143dd612183565b6141e0565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152601f60448201527f414131302073656e64657220616c726561647920636f6e7374727563746564006064820152608490fd5b1561444f57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f4141343120746f6f206c6974746c6520766572696669636174696f6e476173006044820152fd5b919060408382031261035957825167ffffffffffffffff81116103595783019080601f83011215610359578151916144e483610639565b916144f260405193846105ab565b838352602084830101116103595760209261451291848085019101612067565b92015190565b9061044d602f60405180947f414133332072657665727465643a20000000000000000000000000000000000060208301526138268151809260208686019101612067565b93919260609460009460009380519261459b60a08a86015195614580888811614448565b015173ffffffffffffffffffffffffffffffffffffffff1690565b916145c68373ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b946145e2610a2c87546dffffffffffffffffffffffffffff1690565b968588106147825773ffffffffffffffffffffffffffffffffffffffff60208a98946146588a966dffffffffffffffffffffffffffff8b6146919e03166dffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffff0000000000000000000000000000825416179055565b015194604051998a98899788937ff465c77e000000000000000000000000000000000000000000000000000000008552600485016137c0565b0395169103f190818391849361475c575b506147555750506001906146b4612d80565b6308c379a014614733575b506146c657565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601660408201527f4141333320726576657274656420286f72204f4f47290000000000000000000060608201520190565b61473b612d9e565b908161474757506146bf565b610f2191613adf9150614518565b9450925050565b90925061477b91503d8085833e61477381836105ab565b8101906144ad565b91386146a2565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601e60408201527f41413331207061796d6173746572206465706f73697420746f6f206c6f77000060608201520190565b91949293909360609560009560009382519061481660a08b84015193614580848611614448565b936148418573ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b61485c610a2c82546dffffffffffffffffffffffffffff1690565b8781106149b7579273ffffffffffffffffffffffffffffffffffffffff60208a989693946146588a966dffffffffffffffffffffffffffff8d6148d69e9c9a03166dffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffff0000000000000000000000000000825416179055565b0395169103f1908183918493614999575b506149915750506001906148f9612d80565b6308c379a014614972575b5061490c5750565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152601660448201527f4141333320726576657274656420286f72204f4f4729000000000000000000006064820152608490fd5b61497a612d9e565b90816149865750614904565b613dae925050614518565b955093505050565b9092506149b091503d8085833e61477381836105ab565b91386148e7565b610f218a6040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601e60408201527f41413331207061796d6173746572206465706f73697420746f6f206c6f77000060608201520190565b60031115614a2f57565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b929190614a7c6040916002865260606020870152606086019061208a565b930152565b939291906003811015614a2f57604091614a7c91865260606020870152606086019061208a565b9061044d603660405180947f4141353020706f73744f702072657665727465643a20000000000000000000006020830152614aec8151809260208686019101612067565b81010360168101855201836105ab565b929190925a93600091805191614b1183615318565b9260a0810195614b35875173ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff93908481169081614ca457505050614b76825173ffffffffffffffffffffffffffffffffffffffff1690565b985b5a90030193840297604084019089825110614c37577f49628fd1471006c1482da88028e9ce4dbb080b815c9b0344d39e5a8e6ec1419f94614bc26020928c614c329551039061553a565b015194896020614c04614be9865173ffffffffffffffffffffffffffffffffffffffff1690565b9a5173ffffffffffffffffffffffffffffffffffffffff1690565b9401519785604051968796169a16988590949392606092608083019683521515602083015260408201520152565b0390a4565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152602060408201527f414135312070726566756e642062656c6f772061637475616c476173436f737460608201520190565b9a918051614cb4575b5050614b78565b6060850151600099509091803b15614ddb579189918983614d07956040518097819682957fa9a234090000000000000000000000000000000000000000000000000000000084528c029060048401614a5e565b0393f19081614dc8575b50614dc3576001614d20612d80565b6308c379a014614da4575b614d37575b3880614cad565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601260408201527f4141353020706f73744f7020726576657274000000000000000000000000000060608201520190565b614dac612d9e565b80614db75750614d2b565b613adf610f2191614aa8565b614d30565b80610f48614dd59261057b565b38614d11565b8980fd5b9392915a90600092805190614df382615318565b9360a0830196614e17885173ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff95908681169081614f0d57505050614e58845173ffffffffffffffffffffffffffffffffffffffff1690565b915b5a9003019485029860408301908a825110614ea757507f49628fd1471006c1482da88028e9ce4dbb080b815c9b0344d39e5a8e6ec1419f949392614bc2614c32938c60209451039061553a565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152602060448201527f414135312070726566756e642062656c6f772061637475616c476173436f73746064820152608490fd5b93918051614f1d575b5050614e5a565b606087015160009a509091803b1561504357918a918a83614f70956040518097819682957fa9a234090000000000000000000000000000000000000000000000000000000084528c029060048401614a5e565b0393f19081615030575b5061502b576001614f89612d80565b6308c379a01461500e575b614fa0575b3880614f16565b610f218b6040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601260408201527f4141353020706f73744f7020726576657274000000000000000000000000000060608201520190565b615016612d9e565b806150215750614f94565b613dae8d91614aa8565b614f99565b80610f4861503d9261057b565b38614f7a565b8a80fd5b909392915a9480519161505983615318565b9260a081019561507d875173ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff938185169182615165575050506150bd825173ffffffffffffffffffffffffffffffffffffffff1690565b985b5a90030193840297604084019089825110614c37577f49628fd1471006c1482da88028e9ce4dbb080b815c9b0344d39e5a8e6ec1419f946151096020928c614c329551039061553a565b61511288614a25565b015194896020615139614be9865173ffffffffffffffffffffffffffffffffffffffff1690565b940151604080519182529815602082015297880152606087015290821695909116939081906080820190565b9a918151615175575b50506150bf565b8784026151818a614a25565b60028a1461520c576060860151823b15610359576151d493600080948d604051978896879586937fa9a2340900000000000000000000000000000000000000000000000000000000855260048501614a81565b0393f180156151ff575b6151ec575b505b388061516e565b80610f486151f99261057b565b386151e3565b615207612183565b6151de565b6060860151823b156103595761525793600080948d604051978896879586937fa9a2340900000000000000000000000000000000000000000000000000000000855260048501614a81565b0393f19081615305575b50615300576001615270612d80565b6308c379a0146152ed575b156151e5576040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601260408201527f4141353020706f73744f7020726576657274000000000000000000000000000060608201520190565b6152f5612d9e565b80614db7575061527b565b6151e5565b80610f486153129261057b565b38615261565b60e060c082015191015180821461533c57480180821015615337575090565b905090565b5090565b6040519061534d8261058f565b60006040838281528260208201520152565b615367615340565b5065ffffffffffff808260a01c1680156153b3575b604051926153898461058f565b73ffffffffffffffffffffffffffffffffffffffff8116845260d01c602084015216604082015290565b508061537c565b6153cf6153d5916153c9615340565b5061535f565b9161535f565b9073ffffffffffffffffffffffffffffffffffffffff9182825116928315615461575b65ffffffffffff928391826040816020850151169301511693836040816020840151169201511690808410615459575b50808511615451575b506040519561543f8761058f565b16855216602084015216604082015290565b935038615431565b925038615428565b8151811693506153f8565b73ffffffffffffffffffffffffffffffffffffffff16600052600160205267ffffffffffffffff6154c88260401c60406000209077ffffffffffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b918254926154d584612491565b9055161490565b9073ffffffffffffffffffffffffffffffffffffffff6154fa612b50565b9216600052600060205263ffffffff600160406000206dffffffffffffffffffffffffffff815460781c1685520154166020830152565b61044d3361562b565b73ffffffffffffffffffffffffffffffffffffffff16600052600060205260406000206dffffffffffffffffffffffffffff8082541692830180931161561e575b8083116155c05761044d92166dffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffff0000000000000000000000000000825416179055565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f6465706f736974206f766572666c6f77000000000000000000000000000000006044820152fd5b615626612190565b61557b565b73ffffffffffffffffffffffffffffffffffffffff9061564b348261553a565b168060005260006020527f2da466a7b24304f47e87fa2e1e5a81b9831ce54fec19055ce277ca2f39ba42c460206dffffffffffffffffffffffffffff60406000205416604051908152a2565b1561569e57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f6d757374207370656369667920756e7374616b652064656c61790000000000006044820152fd5b1561570357565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f63616e6e6f7420646563726561736520756e7374616b652074696d65000000006044820152fd5b1561576857565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f6e6f207374616b652073706563696669656400000000000000000000000000006044820152fd5b156157cd57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f7374616b65206f766572666c6f770000000000000000000000000000000000006044820152fd5b9065ffffffffffff6080600161044d9461588b6dffffffffffffffffffffffffffff86511682906dffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffff0000000000000000000000000000825416179055565b602085015115156eff000000000000000000000000000082549160701b16807fffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffff83161783557fffffff000000000000000000000000000000ffffffffffffffffffffffffffff7cffffffffffffffffffffffffffff000000000000000000000000000000604089015160781b16921617178155019263ffffffff6060820151167fffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000008554161784550151167fffffffffffffffffffffffffffffffffffffffffffff000000000000ffffffff69ffffffffffff0000000083549260201b169116179055565b1561599657565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f616c726561647920756e7374616b696e670000000000000000000000000000006044820152fd5b91909165ffffffffffff808094169116019182116121cd57565b15615a1557565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f4e6f207374616b6520746f2077697468647261770000000000000000000000006044820152fd5b15615a7a57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f6d7573742063616c6c20756e6c6f636b5374616b6528292066697273740000006044820152fd5b15615adf57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f5374616b65207769746864726177616c206973206e6f742064756500000000006044820152fd5b15615b4457565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f6661696c656420746f207769746864726177207374616b6500000000000000006044820152fd5b15615ba957565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f6661696c656420746f20776974686472617700000000000000000000000000006044820152fd5b816040519182372090565b9060009283809360208451940192f190565b3d610800808211615c4b575b50604051906020818301016040528082526000602083013e90565b905038615c3056fea2646970667358221220a706d8b02d7086d80e9330811f5af84b2614abdc5e9a1f2260126070a31d7cee64736f6c634300081100336080806040523461001657610210908161001c8239f35b600080fdfe6080604052600436101561001257600080fd5b6000803560e01c63570e1a361461002857600080fd5b346100c95760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100c95760043567ffffffffffffffff918282116100c957366023830112156100c95781600401359283116100c95736602484840101116100c9576100c561009e84602485016100fc565b60405173ffffffffffffffffffffffffffffffffffffffff90911681529081906020820190565b0390f35b80fd5b507f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b90806014116101bb5767ffffffffffffffff917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec82018381116101cd575b604051937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f81600b8701160116850190858210908211176101c0575b604052808452602084019036848401116101bb576020946000600c819682946014880187378301015251923560601c5af19060005191156101b557565b60009150565b600080fd5b6101c86100cc565b610178565b6101d56100cc565b61013a56fea26469706673582212201927e80b76ab9b71c952137dd676621a9fdf520c25928815636594036eb1c40364736f6c63430008110033", - "deployedBytecode": "0x60806040526004361015610023575b361561001957600080fd5b610021615531565b005b60003560e01c80630396cb60146101b35780630bd28e3b146101aa5780631b2e01b8146101a15780631d732756146101985780631fad948c1461018f578063205c28781461018657806335567e1a1461017d5780634b1d7cf5146101745780635287ce121461016b57806370a08231146101625780638f41ec5a14610159578063957122ab146101505780639b249f6914610147578063a61935311461013e578063b760faf914610135578063bb9fe6bf1461012c578063c23a5cea14610123578063d6383f941461011a578063ee219423146101115763fc7e286d0361000e5761010c611bcd565b61000e565b5061010c6119b5565b5061010c61184d565b5061010c6116b4565b5061010c611536565b5061010c6114f7565b5061010c6114d6565b5061010c611337565b5061010c611164565b5061010c611129565b5061010c6110a4565b5061010c610f54565b5061010c610bf8565b5061010c610b33565b5061010c610994565b5061010c6108ba565b5061010c6106e7565b5061010c610467565b5061010c610385565b5060207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595760043563ffffffff8116808203610359576103547fa5ae833d0bb1dcd632d98a8b70973e8516812898e19bf27b70071ebc8dc52c01916102716102413373ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b9161024d811515615697565b61026a610261600185015463ffffffff1690565b63ffffffff1690565b11156156fc565b54926103366dffffffffffffffffffffffffffff946102f461029834888460781c166121d5565b966102a4881515615761565b6102b0818911156157c6565b6102d4816102bc6105ec565b941684906dffffffffffffffffffffffffffff169052565b6001602084015287166dffffffffffffffffffffffffffff166040830152565b63ffffffff83166060820152600060808201526103313373ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b61582b565b6040805194855263ffffffff90911660208501523393918291820190565b0390a2005b600080fd5b6024359077ffffffffffffffffffffffffffffffffffffffffffffffff8216820361035957565b50346103595760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595760043577ffffffffffffffffffffffffffffffffffffffffffffffff81168103610359576104149033600052600160205260406000209077ffffffffffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b61041e8154612491565b9055005b73ffffffffffffffffffffffffffffffffffffffff81160361035957565b6024359061044d82610422565b565b60c4359061044d82610422565b359061044d82610422565b50346103595760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595760206104fc6004356104a881610422565b73ffffffffffffffffffffffffffffffffffffffff6104c561035e565b91166000526001835260406000209077ffffffffffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b54604051908152f35b507f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60a0810190811067ffffffffffffffff82111761055157604052565b610559610505565b604052565b610100810190811067ffffffffffffffff82111761055157604052565b67ffffffffffffffff811161055157604052565b6060810190811067ffffffffffffffff82111761055157604052565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761055157604052565b6040519061044d82610535565b6040519060c0820182811067ffffffffffffffff82111761055157604052565b604051906040820182811067ffffffffffffffff82111761055157604052565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f60209267ffffffffffffffff8111610675575b01160190565b61067d610505565b61066f565b92919261068e82610639565b9161069c60405193846105ab565b829481845281830111610359578281602093846000960137010152565b9181601f840112156103595782359167ffffffffffffffff8311610359576020838186019501011161035957565b5034610359576101c07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595767ffffffffffffffff60043581811161035957366023820112156103595761074a903690602481600401359101610682565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc36016101808112610359576101006040519161078783610535565b12610359576040516107988161055e565b6107a0610440565b815260443560208201526064356040820152608435606082015260a43560808201526107ca61044f565b60a082015260e43560c08201526101043560e082015281526101243560208201526101443560408201526101643560608201526101843560808201526101a4359182116103595761083e9261082661082e9336906004016106b9565b9290916128b1565b6040519081529081906020820190565b0390f35b9060407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8301126103595760043567ffffffffffffffff9283821161035957806023830112156103595781600401359384116103595760248460051b830101116103595760240191906024356108b781610422565b90565b5034610359576108c936610842565b6108d4929192611e3a565b6108dd83611d2d565b60005b84811061095d57506000927fbb47ee3e183a558b1a2ff0874b079f3fc5478b7454eacf2bfc5af2ff5878f9728480a183915b85831061092d576109238585611ed7565b6100216001600255565b909193600190610953610941878987611dec565b61094b8886611dca565b51908861233f565b0194019190610912565b8061098b610984610972600194869896611dca565b5161097e848a88611dec565b84613448565b9083612f30565b019290926108e0565b50346103595760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610359576004356109d081610422565b6024359060009133835282602052604083206dffffffffffffffffffffffffffff81541692838311610ad557848373ffffffffffffffffffffffffffffffffffffffff829593610a788496610a3f610a2c8798610ad29c6121c0565b6dffffffffffffffffffffffffffff1690565b6dffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffff0000000000000000000000000000825416179055565b6040805173ffffffffffffffffffffffffffffffffffffffff831681526020810185905233917fd1c19fbcd4551a5edfb66d43d2e337c04837afda3482b42bdf569a8fccdae5fb91a2165af1610acc611ea7565b50615ba2565b80f35b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f576974686472617720616d6f756e7420746f6f206c61726765000000000000006044820152fd5b50346103595760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610359576020600435610b7181610422565b73ffffffffffffffffffffffffffffffffffffffff610b8e61035e565b911660005260018252610bc98160406000209077ffffffffffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000006040519260401b16178152f35b503461035957610c0736610842565b610c0f611e3a565b6000805b838210610df657610c249150611d2d565b7fbb47ee3e183a558b1a2ff0874b079f3fc5478b7454eacf2bfc5af2ff5878f972600080a16000805b848110610d5c57505060008093815b818110610c9357610923868660007f575ff3acadd5ab348fe1855e217e0f3678f8d767d7494c9f9fefbee2e17cca4d8180a2611ed7565b610cf7610ca182848a6124cb565b610ccc610cb3610cb36020840161256d565b73ffffffffffffffffffffffffffffffffffffffff1690565b7f575ff3acadd5ab348fe1855e217e0f3678f8d767d7494c9f9fefbee2e17cca4d600080a280612519565b906000915b808310610d1457505050610d0f90612491565b610c5c565b90919497610d4f610d49610d5592610d438c8b610d3c82610d368e8b8d611dec565b92611dca565b519161233f565b906121d5565b99612491565b95612491565b9190610cfc565b610d678186886124cb565b6020610d7f610d768380612519565b9290930161256d565b9173ffffffffffffffffffffffffffffffffffffffff60009316905b828410610db45750505050610daf90612491565b610c4d565b90919294610d4f81610de985610de2610dd0610dee968d611dca565b51610ddc8c8b8a611dec565b85613448565b908b613148565b612491565b929190610d9b565b610e018285876124cb565b90610e0c8280612519565b92610e1c610cb36020830161256d565b9173ffffffffffffffffffffffffffffffffffffffff8316610e416001821415612577565b610e62575b505050610e5c91610e56916121d5565b91612491565b90610c13565b909592610e7b6040999693999895989788810190611fc8565b92908a3b156103595789938b918a5193849283927fe3563a4f00000000000000000000000000000000000000000000000000000000845260049e8f850193610ec294612711565b03815a93600094fa9081610f3b575b50610f255786517f86a9f75000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8a16818a0190815281906020010390fd5b0390fd5b9497509295509093509181610e56610e5c610e46565b80610f48610f4e9261057b565b8061111e565b38610ed1565b50346103595760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595761083e73ffffffffffffffffffffffffffffffffffffffff600435610fa881610422565b608060409283928351610fba81610535565b60009381858093528260208201528287820152826060820152015216815280602052209061104965ffffffffffff6001835194610ff686610535565b80546dffffffffffffffffffffffffffff8082168852607082901c60ff161515602089015260789190911c1685870152015463ffffffff8116606086015260201c16608084019065ffffffffffff169052565b5191829182919091608065ffffffffffff8160a08401956dffffffffffffffffffffffffffff808251168652602082015115156020870152604082015116604086015263ffffffff6060820151166060860152015116910152565b50346103595760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595773ffffffffffffffffffffffffffffffffffffffff6004356110f581610422565b16600052600060205260206dffffffffffffffffffffffffffff60406000205416604051908152f35b600091031261035957565b50346103595760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261035957602060405160018152f35b50346103595760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261035957600467ffffffffffffffff8135818111610359576111b590369084016106b9565b9050602435916111c483610422565b604435908111610359576111db90369085016106b9565b92909115908161132d575b506112c6576014821015611236575b610f21836040519182917f08c379a0000000000000000000000000000000000000000000000000000000008352820160409060208152600060208201520190565b6112466112529261124c92612b88565b90612b96565b60601c90565b3b1561125f5738806111f5565b610f21906040519182917f08c379a0000000000000000000000000000000000000000000000000000000008352820160609060208152601b60208201527f41413330207061796d6173746572206e6f74206465706c6f796564000000000060408201520190565b610f21836040519182917f08c379a0000000000000000000000000000000000000000000000000000000008352820160609060208152601960208201527f41413230206163636f756e74206e6f74206465706c6f7965640000000000000060408201520190565b90503b15386111e6565b50346103595760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595760043567ffffffffffffffff81116103595761138960249136906004016106b9565b906113bf6040519283927f570e1a3600000000000000000000000000000000000000000000000000000000845260048401612d2c565b0360208273ffffffffffffffffffffffffffffffffffffffff92816000857f0000000000000000000000000000000000000000000000000000000000000000165af1918215611471575b600092611441575b50604051917f6ca7b806000000000000000000000000000000000000000000000000000000008352166004820152fd5b61146391925060203d811161146a575b61145b81836105ab565b810190612d17565b9038611411565b503d611451565b611479612183565b611409565b90816101609103126103595790565b60207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc820112610359576004359067ffffffffffffffff8211610359576108b79160040161147e565b50346103595760206114ef6114ea3661148d565b612a0c565b604051908152f35b5060207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595761002160043561153181610422565b61562b565b5034610359576000807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126116b1573381528060205260408120600181019063ffffffff825416908115611653576115f06115b5611618936115a76115a2855460ff9060701c1690565b61598f565b65ffffffffffff42166159f4565b84547fffffffffffffffffffffffffffffffffffffffffffff000000000000ffffffff16602082901b69ffffffffffff000000001617909455565b7fffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffff8154169055565b60405165ffffffffffff91909116815233907ffa9b3c14cc825c412c9ed81b3ba365a5b459439403f18829e572ed53a4180f0a90602090a280f35b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f6e6f74207374616b6564000000000000000000000000000000000000000000006044820152fd5b80fd5b50346103595760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610359576004356116f081610422565b610ad273ffffffffffffffffffffffffffffffffffffffff6117323373ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b926117ea611755610a2c86546dffffffffffffffffffffffffffff9060781c1690565b94611761861515615a0e565b6117c26001820161179a65ffffffffffff611786835465ffffffffffff9060201c1690565b16611792811515615a73565b421015615ad8565b80547fffffffffffffffffffffffffffffffffffffffffffff00000000000000000000169055565b7fffffff0000000000000000000000000000ffffffffffffffffffffffffffffff8154169055565b6040805173ffffffffffffffffffffffffffffffffffffffff831681526020810186905233917fb7c918e0e249f999e965cafeb6c664271b3f4317d296461500e71da39f0cbda391a2600080809581948294165af1611847611ea7565b50615b3d565b50346103595760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595767ffffffffffffffff6004358181116103595761189e90369060040161147e565b602435916118ab83610422565b604435908111610359576118c6610f219136906004016106b9565b6118ce611caa565b6118d785612e2b565b6118ea6118e48287613240565b906153ba565b946118fa826000924384526121e2565b96438252819360609573ffffffffffffffffffffffffffffffffffffffff8316611981575b50505050608001519361194e6040611940602084015165ffffffffffff1690565b92015165ffffffffffff1690565b906040519687967f8b7ac980000000000000000000000000000000000000000000000000000000008852600488016127e1565b8395508394965061199b60409492939451809481936127d3565b03925af19060806119aa611ea7565b92919038808061191f565b5034610359576119c43661148d565b6119cc611caa565b6119d582612e2b565b6119df8183613240565b825160a00151919391611a0c9073ffffffffffffffffffffffffffffffffffffffff166154dc565b6154dc565b90611a30611a07855173ffffffffffffffffffffffffffffffffffffffff90511690565b94611a39612b50565b50611a68611a4c60409586810190611fc8565b90600060148310611bc55750611246611a079261124c92612b88565b91611a72916153ba565b805173ffffffffffffffffffffffffffffffffffffffff169073ffffffffffffffffffffffffffffffffffffffff821660018114916080880151978781015191886020820151611ac79065ffffffffffff1690565b91015165ffffffffffff16916060015192611ae06105f9565b9a8b5260208b0152841515898b015265ffffffffffff1660608a015265ffffffffffff16608089015260a088015215159081611bbc575b50611b515750610f2192519485947fe0cff05f00000000000000000000000000000000000000000000000000000000865260048601612cbd565b9190610f2193611b60846154dc565b611b87611b6b610619565b73ffffffffffffffffffffffffffffffffffffffff9096168652565b6020850152519586957ffaecb4e400000000000000000000000000000000000000000000000000000000875260048701612c2b565b90501538611b17565b9150506154dc565b50346103595760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595773ffffffffffffffffffffffffffffffffffffffff600435611c1e81610422565b16600052600060205260a0604060002065ffffffffffff60018254920154604051926dffffffffffffffffffffffffffff90818116855260ff8160701c161515602086015260781c16604084015263ffffffff8116606084015260201c166080820152f35b60209067ffffffffffffffff8111611c9d575b60051b0190565b611ca5610505565b611c96565b60405190611cb782610535565b604051608083610100830167ffffffffffffffff811184821017611d20575b60405260009283815283602082015283604082015283606082015283838201528360a08201528360c08201528360e082015281528260208201528260408201528260608201520152565b611d28610505565b611cd6565b90611d3782611c83565b611d4460405191826105ab565b8281527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0611d728294611c83565b019060005b828110611d8357505050565b602090611d8e611caa565b82828501015201611d77565b507f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020918151811015611ddf575b60051b010190565b611de7611d9a565b611dd7565b9190811015611e2d575b60051b810135907ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffea181360301821215610359570190565b611e35611d9a565b611df6565b6002805414611e495760028055565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152fd5b3d15611ed2573d90611eb882610639565b91611ec660405193846105ab565b82523d6000602084013e565b606090565b73ffffffffffffffffffffffffffffffffffffffff168015611f6a57600080809381935af1611f04611ea7565b5015611f0c57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f41413931206661696c65642073656e6420746f2062656e6566696369617279006044820152fd5b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f4141393020696e76616c69642062656e656669636961727900000000000000006044820152fd5b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610359570180359067ffffffffffffffff82116103595760200191813603831361035957565b90816020910312610359575190565b601f82602094937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0938186528686013760008582860101520116010190565b60005b83811061207a5750506000910152565b818101518382015260200161206a565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f6020936120c681518092818752878088019101612067565b0116010190565b906120e76080916108b796946101c0808652850191612028565b9360e0815173ffffffffffffffffffffffffffffffffffffffff80825116602087015260208201516040870152604082015160608701526060820151858701528482015160a087015260a08201511660c086015260c081015182860152015161010084015260208101516101208401526040810151610140840152606081015161016084015201516101808201526101a081840391015261208a565b506040513d6000823e3d90fd5b507f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b919082039182116121cd57565b61044d612190565b919082018092116121cd57565b905a918160206121fb6060830151936060810190611fc8565b906122348560405195869485947f1d732756000000000000000000000000000000000000000000000000000000008652600486016120cd565b03816000305af16000918161230f575b50612308575060206000803e7fdeaddead000000000000000000000000000000000000000000000000000000006000511461229b5761229561228a6108b7945a906121c0565b6080840151906121d5565b91614afc565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152600f60408201527f41413935206f7574206f6620676173000000000000000000000000000000000060608201520190565b9250505090565b61233191925060203d8111612338575b61232981836105ab565b810190612019565b9038612244565b503d61231f565b909291925a9380602061235b6060830151946060810190611fc8565b906123948660405195869485947f1d732756000000000000000000000000000000000000000000000000000000008652600486016120cd565b03816000305af160009181612471575b5061246a575060206000803e7fdeaddead00000000000000000000000000000000000000000000000000000000600051146123fc576123f66123eb6108b795965a906121c0565b6080830151906121d5565b92614ddf565b610f21836040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152600f60408201527f41413935206f7574206f6620676173000000000000000000000000000000000060608201520190565b9450505050565b61248a91925060203d81116123385761232981836105ab565b90386123a4565b6001907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146124bf570190565b6124c7612190565b0190565b919081101561250c575b60051b810135907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa181360301821215610359570190565b612514611d9a565b6124d5565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610359570180359067ffffffffffffffff821161035957602001918160051b3603831361035957565b356108b781610422565b1561257e57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4141393620696e76616c69642061676772656761746f720000000000000000006044820152fd5b90357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18236030181121561035957016020813591019167ffffffffffffffff821161035957813603831361035957565b6108b7916126578161263d8461045c565b73ffffffffffffffffffffffffffffffffffffffff169052565b602082013560208201526126f26126a361268861267760408601866125dc565b610160806040880152860191612028565b61269560608601866125dc565b908583036060870152612028565b6080840135608084015260a084013560a084015260c084013560c084015260e084013560e084015261010080850135908401526101206126e5818601866125dc565b9185840390860152612028565b9161270361014091828101906125dc565b929091818503910152612028565b949391929083604087016040885252606086019360608160051b8801019482600090815b848310612754575050505050508460206108b795968503910152612028565b9091929394977fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa08b820301855288357ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffea1843603018112156127cf57600191846127bd920161262c565b98602090810196950193019190612735565b8280fd5b908092918237016000815290565b9290936108b796959260c0958552602085015265ffffffffffff8092166040850152166060830152151560808201528160a0820152019061208a565b1561282457565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4141393220696e7465726e616c2063616c6c206f6e6c790000000000000000006044820152fd5b9060406108b79260008152816020820152019061208a565b6040906108b793928152816020820152019061208a565b909291925a936128c230331461281d565b8151946040860151955a6113886060830151890101116129e2576108b7966000958051612909575b50505090612903915a9003608084015101943691610682565b91615047565b612938916129349161292f855173ffffffffffffffffffffffffffffffffffffffff1690565b615c12565b1590565b612944575b80806128ea565b61290392919450612953615c24565b908151612967575b5050600193909161293d565b7f1c4fada7374c0a9ee8841fc38afe82932dc0f8e69012e927f061a8bae611a20173ffffffffffffffffffffffffffffffffffffffff6020870151926129d860206129c6835173ffffffffffffffffffffffffffffffffffffffff1690565b9201519560405193849316968361289a565b0390a3388061295b565b7fdeaddead0000000000000000000000000000000000000000000000000000000060005260206000fd5b612a22612a1c6040830183611fc8565b90615c07565b90612a33612a1c6060830183611fc8565b90612ae9612a48612a1c610120840184611fc8565b60405194859360208501956101008201359260e08301359260c08101359260a08201359260808301359273ffffffffffffffffffffffffffffffffffffffff60208201359135168c9693909a9998959261012098959273ffffffffffffffffffffffffffffffffffffffff6101408a019d168952602089015260408801526060870152608086015260a085015260c084015260e08301526101008201520152565b0391612b1b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0938481018352826105ab565b51902060408051602081019283523091810191909152466060820152608092830181529091612b4a90826105ab565b51902090565b604051906040820182811067ffffffffffffffff821117612b7b575b60405260006020838281520152565b612b83610505565b612b6c565b906014116103595790601490565b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000009035818116939260148110612bcb57505050565b60140360031b82901b16169150565b9060c060a06108b793805184526020810151602085015260408101511515604085015265ffffffffffff80606083015116606086015260808201511660808501520151918160a0820152019061208a565b9294612c8c61044d95612c7a610100959998612c68612c54602097610140808c528b0190612bda565b9b878a019060208091805184520151910152565b80516060890152602001516080880152565b805160a08701526020015160c0860152565b73ffffffffffffffffffffffffffffffffffffffff81511660e0850152015191019060208091805184520151910152565b612d0661044d94612cf4612cdf60a0959998969960e0865260e0860190612bda565b98602085019060208091805184520151910152565b80516060840152602001516080830152565b019060208091805184520151910152565b9081602091031261035957516108b781610422565b9160206108b7938181520191612028565b90612d6c73ffffffffffffffffffffffffffffffffffffffff916108b797959694606085526060850191612028565b941660208201526040818503910152612028565b60009060033d11612d8d57565b905060046000803e60005160e01c90565b600060443d106108b7576040517ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc91823d016004833e815167ffffffffffffffff918282113d602484011117612e1a57818401948551938411612e22573d85010160208487010111612e1a57506108b7929101602001906105ab565b949350505050565b50949350505050565b612e386040820182611fc8565b612e50612e448461256d565b93610120810190611fc8565b9290303b1561035957600093612e949160405196879586957f957122ab00000000000000000000000000000000000000000000000000000000875260048701612d3d565b0381305afa9081612f1d575b5061044d576001612eaf612d80565b6308c379a014612ec8575b612ec057565b61044d612183565b612ed0612d9e565b80612edc575b50612eba565b80516000925015612ed657610f21906040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301612882565b80610f48612f2a9261057b565b38612ea0565b9190612f3b9061317f565b73ffffffffffffffffffffffffffffffffffffffff929183166130da5761306c57612f659061317f565b9116612ffe57612f725750565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152602160448201527f41413332207061796d61737465722065787069726564206f72206e6f7420647560648201527f6500000000000000000000000000000000000000000000000000000000000000608482015260a490fd5b610f21826040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601460408201527f41413334207369676e6174757265206572726f7200000000000000000000000060608201520190565b610f21836040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601760408201527f414132322065787069726564206f72206e6f742064756500000000000000000060608201520190565b610f21846040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601460408201527f41413234207369676e6174757265206572726f7200000000000000000000000060608201520190565b9291906131549061317f565b909273ffffffffffffffffffffffffffffffffffffffff808095169116036130da5761306c57612f65905b80156131d25761318e9061535f565b73ffffffffffffffffffffffffffffffffffffffff65ffffffffffff8060408401511642119081156131c2575b5091511691565b90506020830151164210386131bb565b50600090600090565b156131e257565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f41413934206761732076616c756573206f766572666c6f7700000000000000006044820152fd5b916000915a9381519061325382826136b3565b61325c81612a0c565b602084015261329a6effffffffffffffffffffffffffffff60808401516060850151176040850151176101008401359060e0850135171711156131db565b6132a382613775565b6132ae818584613836565b97906132df6129346132d4875173ffffffffffffffffffffffffffffffffffffffff1690565b60208801519061546c565b6133db576132ec43600052565b73ffffffffffffffffffffffffffffffffffffffff61332460a0606097015173ffffffffffffffffffffffffffffffffffffffff1690565b166133c1575b505a810360a0840135106133545760809360c092604087015260608601525a900391013501910152565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601e60408201527f41413430206f76657220766572696669636174696f6e4761734c696d6974000060608201520190565b909350816133d2929750858461455c565b9590923861332a565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601a60408201527f4141323520696e76616c6964206163636f756e74206e6f6e636500000000000060608201520190565b9290916000925a825161345b81846136b3565b61346483612a0c565b60208501526134a26effffffffffffffffffffffffffffff60808301516060840151176040840151176101008601359060e0870135171711156131db565b6134ab81613775565b6134b78186868b613ba2565b98906134e86129346134dd865173ffffffffffffffffffffffffffffffffffffffff1690565b60208701519061546c565b6135e0576134f543600052565b73ffffffffffffffffffffffffffffffffffffffff61352d60a0606096015173ffffffffffffffffffffffffffffffffffffffff1690565b166135c5575b505a840360a08601351061355f5750604085015260608401526080919060c0905a900391013501910152565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152601e60448201527f41413430206f76657220766572696669636174696f6e4761734c696d697400006064820152608490fd5b909250816135d79298508686856147ef565b96909138613533565b610f21826040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601a60408201527f4141323520696e76616c6964206163636f756e74206e6f6e636500000000000060608201520190565b1561365557565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f4141393320696e76616c6964207061796d6173746572416e64446174610000006044820152fd5b613725906136dd6136c38261256d565b73ffffffffffffffffffffffffffffffffffffffff168452565b602081013560208401526080810135604084015260a0810135606084015260c0810135608084015260e081013560c084015261010081013560e0840152610120810190611fc8565b90811561376a5761374f61124c6112468460a09461374a601461044d9998101561364e565b612b88565b73ffffffffffffffffffffffffffffffffffffffff16910152565b505060a06000910152565b60a081015173ffffffffffffffffffffffffffffffffffffffff16156137b75760c060035b60ff60408401519116606084015102016080830151019101510290565b60c0600161379a565b6137d86040929594939560608352606083019061262c565b9460208201520152565b9061044d602f60405180947f414132332072657665727465643a20000000000000000000000000000000000060208301526138268151809260208686019101612067565b810103600f8101855201836105ab565b916000926000925a936139046020835193613865855173ffffffffffffffffffffffffffffffffffffffff1690565b9561387d6138766040830183611fc8565b9084613e0d565b60a086015173ffffffffffffffffffffffffffffffffffffffff16906138a243600052565b85809373ffffffffffffffffffffffffffffffffffffffff809416159889613b3a575b60600151908601516040517f3a871cdd0000000000000000000000000000000000000000000000000000000081529788968795869390600485016137c0565b03938a1690f1829181613b1a575b50613b115750600190613923612d80565b6308c379a014613abd575b50613a50575b613941575b50505a900391565b61396b9073ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b613986610a2c82546dffffffffffffffffffffffffffff1690565b8083116139e3576139dc926dffffffffffffffffffffffffffff9103166dffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffff0000000000000000000000000000825416179055565b3880613939565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601760408201527f41413231206469646e2774207061792070726566756e6400000000000000000060608201520190565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601660408201527f4141323320726576657274656420286f72204f4f47290000000000000000000060608201520190565b613ac5612d9e565b9081613ad1575061392e565b610f2191613adf91506137e2565b6040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301612882565b95506139349050565b613b3391925060203d81116123385761232981836105ab565b9038613912565b9450613b80610a2c613b6c8c73ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b546dffffffffffffffffffffffffffff1690565b8b811115613b975750856060835b969150506138c5565b606087918d03613b8e565b90926000936000935a94613beb6020835193613bd2855173ffffffffffffffffffffffffffffffffffffffff1690565b9561387d613be36040830183611fc8565b90848c61412b565b03938a1690f1829181613ded575b50613de45750600190613c0a612d80565b6308c379a014613d8e575b50613d20575b613c29575b5050505a900391565b613c539073ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b91613c6f610a2c84546dffffffffffffffffffffffffffff1690565b90818311613cba575082547fffffffffffffffffffffffffffffffffffff0000000000000000000000000000169190036dffffffffffffffffffffffffffff16179055388080613c20565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152601760448201527f41413231206469646e2774207061792070726566756e640000000000000000006064820152608490fd5b610f21846040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601660408201527f4141323320726576657274656420286f72204f4f47290000000000000000000060608201520190565b613d96612d9e565b9081613da25750613c15565b8691613dae91506137e2565b90610f216040519283927f220266b60000000000000000000000000000000000000000000000000000000084526004840161289a565b9650613c1b9050565b613e0691925060203d81116123385761232981836105ab565b9038613bf9565b909180613e1957505050565b81515173ffffffffffffffffffffffffffffffffffffffff1692833b6140be57606083510151604051907f570e1a3600000000000000000000000000000000000000000000000000000000825260208280613e78878760048401612d2c565b0381600073ffffffffffffffffffffffffffffffffffffffff95867f00000000000000000000000000000000000000000000000000000000000000001690f19182156140b1575b600092614091575b508082169586156140245716809503613fb7573b15613f4a5761124c6112467fd51a9c61267aa6196961883ecf5ff2da6619c37dac0fa92122513fb32c032d2d93613f1193612b88565b602083810151935160a001516040805173ffffffffffffffffffffffffffffffffffffffff9485168152939091169183019190915290a3565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152602060408201527f4141313520696e6974436f6465206d757374206372656174652073656e64657260608201520190565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152602060408201527f4141313420696e6974436f6465206d7573742072657475726e2073656e64657260608201520190565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601b60408201527f4141313320696e6974436f6465206661696c6564206f72204f4f47000000000060608201520190565b6140aa91925060203d811161146a5761145b81836105ab565b9038613ec7565b6140b9612183565b613ebf565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601f60408201527f414131302073656e64657220616c726561647920636f6e73747275637465640060608201520190565b9290918161413a575b50505050565b82515173ffffffffffffffffffffffffffffffffffffffff1693843b6143e257606084510151604051907f570e1a3600000000000000000000000000000000000000000000000000000000825260208280614199888860048401612d2c565b0381600073ffffffffffffffffffffffffffffffffffffffff95867f00000000000000000000000000000000000000000000000000000000000000001690f19182156143d5575b6000926143b5575b5080821696871561434757168096036142d9573b15614273575061124c6112467fd51a9c61267aa6196961883ecf5ff2da6619c37dac0fa92122513fb32c032d2d9361423393612b88565b602083810151935160a001516040805173ffffffffffffffffffffffffffffffffffffffff9485168152939091169183019190915290a338808080614134565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152602060448201527f4141313520696e6974436f6465206d757374206372656174652073656e6465726064820152608490fd5b610f21826040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152602060408201527f4141313420696e6974436f6465206d7573742072657475726e2073656e64657260608201520190565b610f21846040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601b60408201527f4141313320696e6974436f6465206661696c6564206f72204f4f47000000000060608201520190565b6143ce91925060203d811161146a5761145b81836105ab565b90386141e8565b6143dd612183565b6141e0565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152601f60448201527f414131302073656e64657220616c726561647920636f6e7374727563746564006064820152608490fd5b1561444f57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f4141343120746f6f206c6974746c6520766572696669636174696f6e476173006044820152fd5b919060408382031261035957825167ffffffffffffffff81116103595783019080601f83011215610359578151916144e483610639565b916144f260405193846105ab565b838352602084830101116103595760209261451291848085019101612067565b92015190565b9061044d602f60405180947f414133332072657665727465643a20000000000000000000000000000000000060208301526138268151809260208686019101612067565b93919260609460009460009380519261459b60a08a86015195614580888811614448565b015173ffffffffffffffffffffffffffffffffffffffff1690565b916145c68373ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b946145e2610a2c87546dffffffffffffffffffffffffffff1690565b968588106147825773ffffffffffffffffffffffffffffffffffffffff60208a98946146588a966dffffffffffffffffffffffffffff8b6146919e03166dffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffff0000000000000000000000000000825416179055565b015194604051998a98899788937ff465c77e000000000000000000000000000000000000000000000000000000008552600485016137c0565b0395169103f190818391849361475c575b506147555750506001906146b4612d80565b6308c379a014614733575b506146c657565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601660408201527f4141333320726576657274656420286f72204f4f47290000000000000000000060608201520190565b61473b612d9e565b908161474757506146bf565b610f2191613adf9150614518565b9450925050565b90925061477b91503d8085833e61477381836105ab565b8101906144ad565b91386146a2565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601e60408201527f41413331207061796d6173746572206465706f73697420746f6f206c6f77000060608201520190565b91949293909360609560009560009382519061481660a08b84015193614580848611614448565b936148418573ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b61485c610a2c82546dffffffffffffffffffffffffffff1690565b8781106149b7579273ffffffffffffffffffffffffffffffffffffffff60208a989693946146588a966dffffffffffffffffffffffffffff8d6148d69e9c9a03166dffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffff0000000000000000000000000000825416179055565b0395169103f1908183918493614999575b506149915750506001906148f9612d80565b6308c379a014614972575b5061490c5750565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152601660448201527f4141333320726576657274656420286f72204f4f4729000000000000000000006064820152608490fd5b61497a612d9e565b90816149865750614904565b613dae925050614518565b955093505050565b9092506149b091503d8085833e61477381836105ab565b91386148e7565b610f218a6040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601e60408201527f41413331207061796d6173746572206465706f73697420746f6f206c6f77000060608201520190565b60031115614a2f57565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b929190614a7c6040916002865260606020870152606086019061208a565b930152565b939291906003811015614a2f57604091614a7c91865260606020870152606086019061208a565b9061044d603660405180947f4141353020706f73744f702072657665727465643a20000000000000000000006020830152614aec8151809260208686019101612067565b81010360168101855201836105ab565b929190925a93600091805191614b1183615318565b9260a0810195614b35875173ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff93908481169081614ca457505050614b76825173ffffffffffffffffffffffffffffffffffffffff1690565b985b5a90030193840297604084019089825110614c37577f49628fd1471006c1482da88028e9ce4dbb080b815c9b0344d39e5a8e6ec1419f94614bc26020928c614c329551039061553a565b015194896020614c04614be9865173ffffffffffffffffffffffffffffffffffffffff1690565b9a5173ffffffffffffffffffffffffffffffffffffffff1690565b9401519785604051968796169a16988590949392606092608083019683521515602083015260408201520152565b0390a4565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152602060408201527f414135312070726566756e642062656c6f772061637475616c476173436f737460608201520190565b9a918051614cb4575b5050614b78565b6060850151600099509091803b15614ddb579189918983614d07956040518097819682957fa9a234090000000000000000000000000000000000000000000000000000000084528c029060048401614a5e565b0393f19081614dc8575b50614dc3576001614d20612d80565b6308c379a014614da4575b614d37575b3880614cad565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601260408201527f4141353020706f73744f7020726576657274000000000000000000000000000060608201520190565b614dac612d9e565b80614db75750614d2b565b613adf610f2191614aa8565b614d30565b80610f48614dd59261057b565b38614d11565b8980fd5b9392915a90600092805190614df382615318565b9360a0830196614e17885173ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff95908681169081614f0d57505050614e58845173ffffffffffffffffffffffffffffffffffffffff1690565b915b5a9003019485029860408301908a825110614ea757507f49628fd1471006c1482da88028e9ce4dbb080b815c9b0344d39e5a8e6ec1419f949392614bc2614c32938c60209451039061553a565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152602060448201527f414135312070726566756e642062656c6f772061637475616c476173436f73746064820152608490fd5b93918051614f1d575b5050614e5a565b606087015160009a509091803b1561504357918a918a83614f70956040518097819682957fa9a234090000000000000000000000000000000000000000000000000000000084528c029060048401614a5e565b0393f19081615030575b5061502b576001614f89612d80565b6308c379a01461500e575b614fa0575b3880614f16565b610f218b6040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601260408201527f4141353020706f73744f7020726576657274000000000000000000000000000060608201520190565b615016612d9e565b806150215750614f94565b613dae8d91614aa8565b614f99565b80610f4861503d9261057b565b38614f7a565b8a80fd5b909392915a9480519161505983615318565b9260a081019561507d875173ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff938185169182615165575050506150bd825173ffffffffffffffffffffffffffffffffffffffff1690565b985b5a90030193840297604084019089825110614c37577f49628fd1471006c1482da88028e9ce4dbb080b815c9b0344d39e5a8e6ec1419f946151096020928c614c329551039061553a565b61511288614a25565b015194896020615139614be9865173ffffffffffffffffffffffffffffffffffffffff1690565b940151604080519182529815602082015297880152606087015290821695909116939081906080820190565b9a918151615175575b50506150bf565b8784026151818a614a25565b60028a1461520c576060860151823b15610359576151d493600080948d604051978896879586937fa9a2340900000000000000000000000000000000000000000000000000000000855260048501614a81565b0393f180156151ff575b6151ec575b505b388061516e565b80610f486151f99261057b565b386151e3565b615207612183565b6151de565b6060860151823b156103595761525793600080948d604051978896879586937fa9a2340900000000000000000000000000000000000000000000000000000000855260048501614a81565b0393f19081615305575b50615300576001615270612d80565b6308c379a0146152ed575b156151e5576040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601260408201527f4141353020706f73744f7020726576657274000000000000000000000000000060608201520190565b6152f5612d9e565b80614db7575061527b565b6151e5565b80610f486153129261057b565b38615261565b60e060c082015191015180821461533c57480180821015615337575090565b905090565b5090565b6040519061534d8261058f565b60006040838281528260208201520152565b615367615340565b5065ffffffffffff808260a01c1680156153b3575b604051926153898461058f565b73ffffffffffffffffffffffffffffffffffffffff8116845260d01c602084015216604082015290565b508061537c565b6153cf6153d5916153c9615340565b5061535f565b9161535f565b9073ffffffffffffffffffffffffffffffffffffffff9182825116928315615461575b65ffffffffffff928391826040816020850151169301511693836040816020840151169201511690808410615459575b50808511615451575b506040519561543f8761058f565b16855216602084015216604082015290565b935038615431565b925038615428565b8151811693506153f8565b73ffffffffffffffffffffffffffffffffffffffff16600052600160205267ffffffffffffffff6154c88260401c60406000209077ffffffffffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b918254926154d584612491565b9055161490565b9073ffffffffffffffffffffffffffffffffffffffff6154fa612b50565b9216600052600060205263ffffffff600160406000206dffffffffffffffffffffffffffff815460781c1685520154166020830152565b61044d3361562b565b73ffffffffffffffffffffffffffffffffffffffff16600052600060205260406000206dffffffffffffffffffffffffffff8082541692830180931161561e575b8083116155c05761044d92166dffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffff0000000000000000000000000000825416179055565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f6465706f736974206f766572666c6f77000000000000000000000000000000006044820152fd5b615626612190565b61557b565b73ffffffffffffffffffffffffffffffffffffffff9061564b348261553a565b168060005260006020527f2da466a7b24304f47e87fa2e1e5a81b9831ce54fec19055ce277ca2f39ba42c460206dffffffffffffffffffffffffffff60406000205416604051908152a2565b1561569e57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f6d757374207370656369667920756e7374616b652064656c61790000000000006044820152fd5b1561570357565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f63616e6e6f7420646563726561736520756e7374616b652074696d65000000006044820152fd5b1561576857565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f6e6f207374616b652073706563696669656400000000000000000000000000006044820152fd5b156157cd57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f7374616b65206f766572666c6f770000000000000000000000000000000000006044820152fd5b9065ffffffffffff6080600161044d9461588b6dffffffffffffffffffffffffffff86511682906dffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffff0000000000000000000000000000825416179055565b602085015115156eff000000000000000000000000000082549160701b16807fffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffff83161783557fffffff000000000000000000000000000000ffffffffffffffffffffffffffff7cffffffffffffffffffffffffffff000000000000000000000000000000604089015160781b16921617178155019263ffffffff6060820151167fffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000008554161784550151167fffffffffffffffffffffffffffffffffffffffffffff000000000000ffffffff69ffffffffffff0000000083549260201b169116179055565b1561599657565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f616c726561647920756e7374616b696e670000000000000000000000000000006044820152fd5b91909165ffffffffffff808094169116019182116121cd57565b15615a1557565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f4e6f207374616b6520746f2077697468647261770000000000000000000000006044820152fd5b15615a7a57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f6d7573742063616c6c20756e6c6f636b5374616b6528292066697273740000006044820152fd5b15615adf57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f5374616b65207769746864726177616c206973206e6f742064756500000000006044820152fd5b15615b4457565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f6661696c656420746f207769746864726177207374616b6500000000000000006044820152fd5b15615ba957565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f6661696c656420746f20776974686472617700000000000000000000000000006044820152fd5b816040519182372090565b9060009283809360208451940192f190565b3d610800808211615c4b575b50604051906020818301016040528082526000602083013e90565b905038615c3056fea2646970667358221220a706d8b02d7086d80e9330811f5af84b2614abdc5e9a1f2260126070a31d7cee64736f6c63430008110033", - "linkReferences": {}, - "deployedLinkReferences": {} -} diff --git a/packages/common/abis/entrypoint/EntryPoint_v0.0.6.json b/packages/common/abis/entrypoint/EntryPoint_v0.0.6.json deleted file mode 100644 index 270d5ded1..000000000 --- a/packages/common/abis/entrypoint/EntryPoint_v0.0.6.json +++ /dev/null @@ -1,1318 +0,0 @@ -{ - "_format": "hh-sol-artifact-1", - "contractName": "EntryPoint", - "sourceName": "contracts/core/EntryPoint.sol", - "abi": [ - { - "inputs": [ - { - "internalType": "uint256", - "name": "preOpGas", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "paid", - "type": "uint256" - }, - { - "internalType": "uint48", - "name": "validAfter", - "type": "uint48" - }, - { - "internalType": "uint48", - "name": "validUntil", - "type": "uint48" - }, - { - "internalType": "bool", - "name": "targetSuccess", - "type": "bool" - }, - { - "internalType": "bytes", - "name": "targetResult", - "type": "bytes" - } - ], - "name": "ExecutionResult", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "opIndex", - "type": "uint256" - }, - { - "internalType": "string", - "name": "reason", - "type": "string" - } - ], - "name": "FailedOp", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "sender", - "type": "address" - } - ], - "name": "SenderAddressResult", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "aggregator", - "type": "address" - } - ], - "name": "SignatureValidationFailed", - "type": "error" - }, - { - "inputs": [ - { - "components": [ - { - "internalType": "uint256", - "name": "preOpGas", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "prefund", - "type": "uint256" - }, - { - "internalType": "bool", - "name": "sigFailed", - "type": "bool" - }, - { - "internalType": "uint48", - "name": "validAfter", - "type": "uint48" - }, - { - "internalType": "uint48", - "name": "validUntil", - "type": "uint48" - }, - { - "internalType": "bytes", - "name": "paymasterContext", - "type": "bytes" - } - ], - "internalType": "struct IEntryPoint.ReturnInfo", - "name": "returnInfo", - "type": "tuple" - }, - { - "components": [ - { - "internalType": "uint256", - "name": "stake", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "unstakeDelaySec", - "type": "uint256" - } - ], - "internalType": "struct IStakeManager.StakeInfo", - "name": "senderInfo", - "type": "tuple" - }, - { - "components": [ - { - "internalType": "uint256", - "name": "stake", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "unstakeDelaySec", - "type": "uint256" - } - ], - "internalType": "struct IStakeManager.StakeInfo", - "name": "factoryInfo", - "type": "tuple" - }, - { - "components": [ - { - "internalType": "uint256", - "name": "stake", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "unstakeDelaySec", - "type": "uint256" - } - ], - "internalType": "struct IStakeManager.StakeInfo", - "name": "paymasterInfo", - "type": "tuple" - } - ], - "name": "ValidationResult", - "type": "error" - }, - { - "inputs": [ - { - "components": [ - { - "internalType": "uint256", - "name": "preOpGas", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "prefund", - "type": "uint256" - }, - { - "internalType": "bool", - "name": "sigFailed", - "type": "bool" - }, - { - "internalType": "uint48", - "name": "validAfter", - "type": "uint48" - }, - { - "internalType": "uint48", - "name": "validUntil", - "type": "uint48" - }, - { - "internalType": "bytes", - "name": "paymasterContext", - "type": "bytes" - } - ], - "internalType": "struct IEntryPoint.ReturnInfo", - "name": "returnInfo", - "type": "tuple" - }, - { - "components": [ - { - "internalType": "uint256", - "name": "stake", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "unstakeDelaySec", - "type": "uint256" - } - ], - "internalType": "struct IStakeManager.StakeInfo", - "name": "senderInfo", - "type": "tuple" - }, - { - "components": [ - { - "internalType": "uint256", - "name": "stake", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "unstakeDelaySec", - "type": "uint256" - } - ], - "internalType": "struct IStakeManager.StakeInfo", - "name": "factoryInfo", - "type": "tuple" - }, - { - "components": [ - { - "internalType": "uint256", - "name": "stake", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "unstakeDelaySec", - "type": "uint256" - } - ], - "internalType": "struct IStakeManager.StakeInfo", - "name": "paymasterInfo", - "type": "tuple" - }, - { - "components": [ - { - "internalType": "address", - "name": "aggregator", - "type": "address" - }, - { - "components": [ - { - "internalType": "uint256", - "name": "stake", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "unstakeDelaySec", - "type": "uint256" - } - ], - "internalType": "struct IStakeManager.StakeInfo", - "name": "stakeInfo", - "type": "tuple" - } - ], - "internalType": "struct IEntryPoint.AggregatorStakeInfo", - "name": "aggregatorInfo", - "type": "tuple" - } - ], - "name": "ValidationResultWithAggregation", - "type": "error" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "bytes32", - "name": "userOpHash", - "type": "bytes32" - }, - { - "indexed": true, - "internalType": "address", - "name": "sender", - "type": "address" - }, - { - "indexed": false, - "internalType": "address", - "name": "factory", - "type": "address" - }, - { - "indexed": false, - "internalType": "address", - "name": "paymaster", - "type": "address" - } - ], - "name": "AccountDeployed", - "type": "event" - }, - { - "anonymous": false, - "inputs": [], - "name": "BeforeExecution", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "account", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "totalDeposit", - "type": "uint256" - } - ], - "name": "Deposited", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "aggregator", - "type": "address" - } - ], - "name": "SignatureAggregatorChanged", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "account", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "totalStaked", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "unstakeDelaySec", - "type": "uint256" - } - ], - "name": "StakeLocked", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "account", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "withdrawTime", - "type": "uint256" - } - ], - "name": "StakeUnlocked", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "account", - "type": "address" - }, - { - "indexed": false, - "internalType": "address", - "name": "withdrawAddress", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "name": "StakeWithdrawn", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "bytes32", - "name": "userOpHash", - "type": "bytes32" - }, - { - "indexed": true, - "internalType": "address", - "name": "sender", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "paymaster", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "nonce", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "bool", - "name": "success", - "type": "bool" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "actualGasCost", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "actualGasUsed", - "type": "uint256" - } - ], - "name": "UserOperationEvent", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "bytes32", - "name": "userOpHash", - "type": "bytes32" - }, - { - "indexed": true, - "internalType": "address", - "name": "sender", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "nonce", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "bytes", - "name": "revertReason", - "type": "bytes" - } - ], - "name": "UserOperationRevertReason", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "account", - "type": "address" - }, - { - "indexed": false, - "internalType": "address", - "name": "withdrawAddress", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "name": "Withdrawn", - "type": "event" - }, - { - "inputs": [], - "name": "SIG_VALIDATION_FAILED", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes", - "name": "initCode", - "type": "bytes" - }, - { - "internalType": "address", - "name": "sender", - "type": "address" - }, - { - "internalType": "bytes", - "name": "paymasterAndData", - "type": "bytes" - } - ], - "name": "_validateSenderAndPaymaster", - "outputs": [], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint32", - "name": "unstakeDelaySec", - "type": "uint32" - } - ], - "name": "addStake", - "outputs": [], - "stateMutability": "payable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "account", - "type": "address" - } - ], - "name": "balanceOf", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "account", - "type": "address" - } - ], - "name": "depositTo", - "outputs": [], - "stateMutability": "payable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "name": "deposits", - "outputs": [ - { - "internalType": "uint112", - "name": "deposit", - "type": "uint112" - }, - { - "internalType": "bool", - "name": "staked", - "type": "bool" - }, - { - "internalType": "uint112", - "name": "stake", - "type": "uint112" - }, - { - "internalType": "uint32", - "name": "unstakeDelaySec", - "type": "uint32" - }, - { - "internalType": "uint48", - "name": "withdrawTime", - "type": "uint48" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "account", - "type": "address" - } - ], - "name": "getDepositInfo", - "outputs": [ - { - "components": [ - { - "internalType": "uint112", - "name": "deposit", - "type": "uint112" - }, - { - "internalType": "bool", - "name": "staked", - "type": "bool" - }, - { - "internalType": "uint112", - "name": "stake", - "type": "uint112" - }, - { - "internalType": "uint32", - "name": "unstakeDelaySec", - "type": "uint32" - }, - { - "internalType": "uint48", - "name": "withdrawTime", - "type": "uint48" - } - ], - "internalType": "struct IStakeManager.DepositInfo", - "name": "info", - "type": "tuple" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "sender", - "type": "address" - }, - { - "internalType": "uint192", - "name": "key", - "type": "uint192" - } - ], - "name": "getNonce", - "outputs": [ - { - "internalType": "uint256", - "name": "nonce", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes", - "name": "initCode", - "type": "bytes" - } - ], - "name": "getSenderAddress", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "components": [ - { - "internalType": "address", - "name": "sender", - "type": "address" - }, - { - "internalType": "uint256", - "name": "nonce", - "type": "uint256" - }, - { - "internalType": "bytes", - "name": "initCode", - "type": "bytes" - }, - { - "internalType": "bytes", - "name": "callData", - "type": "bytes" - }, - { - "internalType": "uint256", - "name": "callGasLimit", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "verificationGasLimit", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "preVerificationGas", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "maxFeePerGas", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "maxPriorityFeePerGas", - "type": "uint256" - }, - { - "internalType": "bytes", - "name": "paymasterAndData", - "type": "bytes" - }, - { - "internalType": "bytes", - "name": "signature", - "type": "bytes" - } - ], - "internalType": "struct UserOperation", - "name": "userOp", - "type": "tuple" - } - ], - "name": "getUserOpHash", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "components": [ - { - "components": [ - { - "internalType": "address", - "name": "sender", - "type": "address" - }, - { - "internalType": "uint256", - "name": "nonce", - "type": "uint256" - }, - { - "internalType": "bytes", - "name": "initCode", - "type": "bytes" - }, - { - "internalType": "bytes", - "name": "callData", - "type": "bytes" - }, - { - "internalType": "uint256", - "name": "callGasLimit", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "verificationGasLimit", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "preVerificationGas", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "maxFeePerGas", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "maxPriorityFeePerGas", - "type": "uint256" - }, - { - "internalType": "bytes", - "name": "paymasterAndData", - "type": "bytes" - }, - { - "internalType": "bytes", - "name": "signature", - "type": "bytes" - } - ], - "internalType": "struct UserOperation[]", - "name": "userOps", - "type": "tuple[]" - }, - { - "internalType": "contract IAggregator", - "name": "aggregator", - "type": "address" - }, - { - "internalType": "bytes", - "name": "signature", - "type": "bytes" - } - ], - "internalType": "struct IEntryPoint.UserOpsPerAggregator[]", - "name": "opsPerAggregator", - "type": "tuple[]" - }, - { - "internalType": "address payable", - "name": "beneficiary", - "type": "address" - } - ], - "name": "handleAggregatedOps", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "components": [ - { - "internalType": "address", - "name": "sender", - "type": "address" - }, - { - "internalType": "uint256", - "name": "nonce", - "type": "uint256" - }, - { - "internalType": "bytes", - "name": "initCode", - "type": "bytes" - }, - { - "internalType": "bytes", - "name": "callData", - "type": "bytes" - }, - { - "internalType": "uint256", - "name": "callGasLimit", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "verificationGasLimit", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "preVerificationGas", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "maxFeePerGas", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "maxPriorityFeePerGas", - "type": "uint256" - }, - { - "internalType": "bytes", - "name": "paymasterAndData", - "type": "bytes" - }, - { - "internalType": "bytes", - "name": "signature", - "type": "bytes" - } - ], - "internalType": "struct UserOperation[]", - "name": "ops", - "type": "tuple[]" - }, - { - "internalType": "address payable", - "name": "beneficiary", - "type": "address" - } - ], - "name": "handleOps", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint192", - "name": "key", - "type": "uint192" - } - ], - "name": "incrementNonce", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes", - "name": "callData", - "type": "bytes" - }, - { - "components": [ - { - "components": [ - { - "internalType": "address", - "name": "sender", - "type": "address" - }, - { - "internalType": "uint256", - "name": "nonce", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "callGasLimit", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "verificationGasLimit", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "preVerificationGas", - "type": "uint256" - }, - { - "internalType": "address", - "name": "paymaster", - "type": "address" - }, - { - "internalType": "uint256", - "name": "maxFeePerGas", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "maxPriorityFeePerGas", - "type": "uint256" - } - ], - "internalType": "struct EntryPoint.MemoryUserOp", - "name": "mUserOp", - "type": "tuple" - }, - { - "internalType": "bytes32", - "name": "userOpHash", - "type": "bytes32" - }, - { - "internalType": "uint256", - "name": "prefund", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "contextOffset", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "preOpGas", - "type": "uint256" - } - ], - "internalType": "struct EntryPoint.UserOpInfo", - "name": "opInfo", - "type": "tuple" - }, - { - "internalType": "bytes", - "name": "context", - "type": "bytes" - } - ], - "name": "innerHandleOp", - "outputs": [ - { - "internalType": "uint256", - "name": "actualGasCost", - "type": "uint256" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - }, - { - "internalType": "uint192", - "name": "", - "type": "uint192" - } - ], - "name": "nonceSequenceNumber", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "components": [ - { - "internalType": "address", - "name": "sender", - "type": "address" - }, - { - "internalType": "uint256", - "name": "nonce", - "type": "uint256" - }, - { - "internalType": "bytes", - "name": "initCode", - "type": "bytes" - }, - { - "internalType": "bytes", - "name": "callData", - "type": "bytes" - }, - { - "internalType": "uint256", - "name": "callGasLimit", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "verificationGasLimit", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "preVerificationGas", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "maxFeePerGas", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "maxPriorityFeePerGas", - "type": "uint256" - }, - { - "internalType": "bytes", - "name": "paymasterAndData", - "type": "bytes" - }, - { - "internalType": "bytes", - "name": "signature", - "type": "bytes" - } - ], - "internalType": "struct UserOperation", - "name": "op", - "type": "tuple" - }, - { - "internalType": "address", - "name": "target", - "type": "address" - }, - { - "internalType": "bytes", - "name": "targetCallData", - "type": "bytes" - } - ], - "name": "simulateHandleOp", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "components": [ - { - "internalType": "address", - "name": "sender", - "type": "address" - }, - { - "internalType": "uint256", - "name": "nonce", - "type": "uint256" - }, - { - "internalType": "bytes", - "name": "initCode", - "type": "bytes" - }, - { - "internalType": "bytes", - "name": "callData", - "type": "bytes" - }, - { - "internalType": "uint256", - "name": "callGasLimit", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "verificationGasLimit", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "preVerificationGas", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "maxFeePerGas", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "maxPriorityFeePerGas", - "type": "uint256" - }, - { - "internalType": "bytes", - "name": "paymasterAndData", - "type": "bytes" - }, - { - "internalType": "bytes", - "name": "signature", - "type": "bytes" - } - ], - "internalType": "struct UserOperation", - "name": "userOp", - "type": "tuple" - } - ], - "name": "simulateValidation", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "unlockStake", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address payable", - "name": "withdrawAddress", - "type": "address" - } - ], - "name": "withdrawStake", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address payable", - "name": "withdrawAddress", - "type": "address" - }, - { - "internalType": "uint256", - "name": "withdrawAmount", - "type": "uint256" - } - ], - "name": "withdrawTo", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "stateMutability": "payable", - "type": "receive" - } - ], - "bytecode": "0x60a080604052346200008957600160025561022c8181016001600160401b038111838210176200007357829162005d18833903906000f080156200006757608052604051615c8990816200008f82396080518181816113df01528181613e9501526141b60152f35b6040513d6000823e3d90fd5b634e487b7160e01b600052604160045260246000fd5b600080fdfe60806040526004361015610023575b361561001957600080fd5b610021615531565b005b60003560e01c80630396cb60146101b35780630bd28e3b146101aa5780631b2e01b8146101a15780631d732756146101985780631fad948c1461018f578063205c28781461018657806335567e1a1461017d5780634b1d7cf5146101745780635287ce121461016b57806370a08231146101625780638f41ec5a14610159578063957122ab146101505780639b249f6914610147578063a61935311461013e578063b760faf914610135578063bb9fe6bf1461012c578063c23a5cea14610123578063d6383f941461011a578063ee219423146101115763fc7e286d0361000e5761010c611bcd565b61000e565b5061010c6119b5565b5061010c61184d565b5061010c6116b4565b5061010c611536565b5061010c6114f7565b5061010c6114d6565b5061010c611337565b5061010c611164565b5061010c611129565b5061010c6110a4565b5061010c610f54565b5061010c610bf8565b5061010c610b33565b5061010c610994565b5061010c6108ba565b5061010c6106e7565b5061010c610467565b5061010c610385565b5060207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595760043563ffffffff8116808203610359576103547fa5ae833d0bb1dcd632d98a8b70973e8516812898e19bf27b70071ebc8dc52c01916102716102413373ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b9161024d811515615697565b61026a610261600185015463ffffffff1690565b63ffffffff1690565b11156156fc565b54926103366dffffffffffffffffffffffffffff946102f461029834888460781c166121d5565b966102a4881515615761565b6102b0818911156157c6565b6102d4816102bc6105ec565b941684906dffffffffffffffffffffffffffff169052565b6001602084015287166dffffffffffffffffffffffffffff166040830152565b63ffffffff83166060820152600060808201526103313373ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b61582b565b6040805194855263ffffffff90911660208501523393918291820190565b0390a2005b600080fd5b6024359077ffffffffffffffffffffffffffffffffffffffffffffffff8216820361035957565b50346103595760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595760043577ffffffffffffffffffffffffffffffffffffffffffffffff81168103610359576104149033600052600160205260406000209077ffffffffffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b61041e8154612491565b9055005b73ffffffffffffffffffffffffffffffffffffffff81160361035957565b6024359061044d82610422565b565b60c4359061044d82610422565b359061044d82610422565b50346103595760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595760206104fc6004356104a881610422565b73ffffffffffffffffffffffffffffffffffffffff6104c561035e565b91166000526001835260406000209077ffffffffffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b54604051908152f35b507f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60a0810190811067ffffffffffffffff82111761055157604052565b610559610505565b604052565b610100810190811067ffffffffffffffff82111761055157604052565b67ffffffffffffffff811161055157604052565b6060810190811067ffffffffffffffff82111761055157604052565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761055157604052565b6040519061044d82610535565b6040519060c0820182811067ffffffffffffffff82111761055157604052565b604051906040820182811067ffffffffffffffff82111761055157604052565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f60209267ffffffffffffffff8111610675575b01160190565b61067d610505565b61066f565b92919261068e82610639565b9161069c60405193846105ab565b829481845281830111610359578281602093846000960137010152565b9181601f840112156103595782359167ffffffffffffffff8311610359576020838186019501011161035957565b5034610359576101c07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595767ffffffffffffffff60043581811161035957366023820112156103595761074a903690602481600401359101610682565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc36016101808112610359576101006040519161078783610535565b12610359576040516107988161055e565b6107a0610440565b815260443560208201526064356040820152608435606082015260a43560808201526107ca61044f565b60a082015260e43560c08201526101043560e082015281526101243560208201526101443560408201526101643560608201526101843560808201526101a4359182116103595761083e9261082661082e9336906004016106b9565b9290916128b1565b6040519081529081906020820190565b0390f35b9060407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8301126103595760043567ffffffffffffffff9283821161035957806023830112156103595781600401359384116103595760248460051b830101116103595760240191906024356108b781610422565b90565b5034610359576108c936610842565b6108d4929192611e3a565b6108dd83611d2d565b60005b84811061095d57506000927fbb47ee3e183a558b1a2ff0874b079f3fc5478b7454eacf2bfc5af2ff5878f9728480a183915b85831061092d576109238585611ed7565b6100216001600255565b909193600190610953610941878987611dec565b61094b8886611dca565b51908861233f565b0194019190610912565b8061098b610984610972600194869896611dca565b5161097e848a88611dec565b84613448565b9083612f30565b019290926108e0565b50346103595760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610359576004356109d081610422565b6024359060009133835282602052604083206dffffffffffffffffffffffffffff81541692838311610ad557848373ffffffffffffffffffffffffffffffffffffffff829593610a788496610a3f610a2c8798610ad29c6121c0565b6dffffffffffffffffffffffffffff1690565b6dffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffff0000000000000000000000000000825416179055565b6040805173ffffffffffffffffffffffffffffffffffffffff831681526020810185905233917fd1c19fbcd4551a5edfb66d43d2e337c04837afda3482b42bdf569a8fccdae5fb91a2165af1610acc611ea7565b50615ba2565b80f35b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f576974686472617720616d6f756e7420746f6f206c61726765000000000000006044820152fd5b50346103595760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610359576020600435610b7181610422565b73ffffffffffffffffffffffffffffffffffffffff610b8e61035e565b911660005260018252610bc98160406000209077ffffffffffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000006040519260401b16178152f35b503461035957610c0736610842565b610c0f611e3a565b6000805b838210610df657610c249150611d2d565b7fbb47ee3e183a558b1a2ff0874b079f3fc5478b7454eacf2bfc5af2ff5878f972600080a16000805b848110610d5c57505060008093815b818110610c9357610923868660007f575ff3acadd5ab348fe1855e217e0f3678f8d767d7494c9f9fefbee2e17cca4d8180a2611ed7565b610cf7610ca182848a6124cb565b610ccc610cb3610cb36020840161256d565b73ffffffffffffffffffffffffffffffffffffffff1690565b7f575ff3acadd5ab348fe1855e217e0f3678f8d767d7494c9f9fefbee2e17cca4d600080a280612519565b906000915b808310610d1457505050610d0f90612491565b610c5c565b90919497610d4f610d49610d5592610d438c8b610d3c82610d368e8b8d611dec565b92611dca565b519161233f565b906121d5565b99612491565b95612491565b9190610cfc565b610d678186886124cb565b6020610d7f610d768380612519565b9290930161256d565b9173ffffffffffffffffffffffffffffffffffffffff60009316905b828410610db45750505050610daf90612491565b610c4d565b90919294610d4f81610de985610de2610dd0610dee968d611dca565b51610ddc8c8b8a611dec565b85613448565b908b613148565b612491565b929190610d9b565b610e018285876124cb565b90610e0c8280612519565b92610e1c610cb36020830161256d565b9173ffffffffffffffffffffffffffffffffffffffff8316610e416001821415612577565b610e62575b505050610e5c91610e56916121d5565b91612491565b90610c13565b909592610e7b6040999693999895989788810190611fc8565b92908a3b156103595789938b918a5193849283927fe3563a4f00000000000000000000000000000000000000000000000000000000845260049e8f850193610ec294612711565b03815a93600094fa9081610f3b575b50610f255786517f86a9f75000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8a16818a0190815281906020010390fd5b0390fd5b9497509295509093509181610e56610e5c610e46565b80610f48610f4e9261057b565b8061111e565b38610ed1565b50346103595760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595761083e73ffffffffffffffffffffffffffffffffffffffff600435610fa881610422565b608060409283928351610fba81610535565b60009381858093528260208201528287820152826060820152015216815280602052209061104965ffffffffffff6001835194610ff686610535565b80546dffffffffffffffffffffffffffff8082168852607082901c60ff161515602089015260789190911c1685870152015463ffffffff8116606086015260201c16608084019065ffffffffffff169052565b5191829182919091608065ffffffffffff8160a08401956dffffffffffffffffffffffffffff808251168652602082015115156020870152604082015116604086015263ffffffff6060820151166060860152015116910152565b50346103595760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595773ffffffffffffffffffffffffffffffffffffffff6004356110f581610422565b16600052600060205260206dffffffffffffffffffffffffffff60406000205416604051908152f35b600091031261035957565b50346103595760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261035957602060405160018152f35b50346103595760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261035957600467ffffffffffffffff8135818111610359576111b590369084016106b9565b9050602435916111c483610422565b604435908111610359576111db90369085016106b9565b92909115908161132d575b506112c6576014821015611236575b610f21836040519182917f08c379a0000000000000000000000000000000000000000000000000000000008352820160409060208152600060208201520190565b6112466112529261124c92612b88565b90612b96565b60601c90565b3b1561125f5738806111f5565b610f21906040519182917f08c379a0000000000000000000000000000000000000000000000000000000008352820160609060208152601b60208201527f41413330207061796d6173746572206e6f74206465706c6f796564000000000060408201520190565b610f21836040519182917f08c379a0000000000000000000000000000000000000000000000000000000008352820160609060208152601960208201527f41413230206163636f756e74206e6f74206465706c6f7965640000000000000060408201520190565b90503b15386111e6565b50346103595760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595760043567ffffffffffffffff81116103595761138960249136906004016106b9565b906113bf6040519283927f570e1a3600000000000000000000000000000000000000000000000000000000845260048401612d2c565b0360208273ffffffffffffffffffffffffffffffffffffffff92816000857f0000000000000000000000000000000000000000000000000000000000000000165af1918215611471575b600092611441575b50604051917f6ca7b806000000000000000000000000000000000000000000000000000000008352166004820152fd5b61146391925060203d811161146a575b61145b81836105ab565b810190612d17565b9038611411565b503d611451565b611479612183565b611409565b90816101609103126103595790565b60207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc820112610359576004359067ffffffffffffffff8211610359576108b79160040161147e565b50346103595760206114ef6114ea3661148d565b612a0c565b604051908152f35b5060207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595761002160043561153181610422565b61562b565b5034610359576000807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126116b1573381528060205260408120600181019063ffffffff825416908115611653576115f06115b5611618936115a76115a2855460ff9060701c1690565b61598f565b65ffffffffffff42166159f4565b84547fffffffffffffffffffffffffffffffffffffffffffff000000000000ffffffff16602082901b69ffffffffffff000000001617909455565b7fffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffff8154169055565b60405165ffffffffffff91909116815233907ffa9b3c14cc825c412c9ed81b3ba365a5b459439403f18829e572ed53a4180f0a90602090a280f35b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f6e6f74207374616b6564000000000000000000000000000000000000000000006044820152fd5b80fd5b50346103595760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610359576004356116f081610422565b610ad273ffffffffffffffffffffffffffffffffffffffff6117323373ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b926117ea611755610a2c86546dffffffffffffffffffffffffffff9060781c1690565b94611761861515615a0e565b6117c26001820161179a65ffffffffffff611786835465ffffffffffff9060201c1690565b16611792811515615a73565b421015615ad8565b80547fffffffffffffffffffffffffffffffffffffffffffff00000000000000000000169055565b7fffffff0000000000000000000000000000ffffffffffffffffffffffffffffff8154169055565b6040805173ffffffffffffffffffffffffffffffffffffffff831681526020810186905233917fb7c918e0e249f999e965cafeb6c664271b3f4317d296461500e71da39f0cbda391a2600080809581948294165af1611847611ea7565b50615b3d565b50346103595760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595767ffffffffffffffff6004358181116103595761189e90369060040161147e565b602435916118ab83610422565b604435908111610359576118c6610f219136906004016106b9565b6118ce611caa565b6118d785612e2b565b6118ea6118e48287613240565b906153ba565b946118fa826000924384526121e2565b96438252819360609573ffffffffffffffffffffffffffffffffffffffff8316611981575b50505050608001519361194e6040611940602084015165ffffffffffff1690565b92015165ffffffffffff1690565b906040519687967f8b7ac980000000000000000000000000000000000000000000000000000000008852600488016127e1565b8395508394965061199b60409492939451809481936127d3565b03925af19060806119aa611ea7565b92919038808061191f565b5034610359576119c43661148d565b6119cc611caa565b6119d582612e2b565b6119df8183613240565b825160a00151919391611a0c9073ffffffffffffffffffffffffffffffffffffffff166154dc565b6154dc565b90611a30611a07855173ffffffffffffffffffffffffffffffffffffffff90511690565b94611a39612b50565b50611a68611a4c60409586810190611fc8565b90600060148310611bc55750611246611a079261124c92612b88565b91611a72916153ba565b805173ffffffffffffffffffffffffffffffffffffffff169073ffffffffffffffffffffffffffffffffffffffff821660018114916080880151978781015191886020820151611ac79065ffffffffffff1690565b91015165ffffffffffff16916060015192611ae06105f9565b9a8b5260208b0152841515898b015265ffffffffffff1660608a015265ffffffffffff16608089015260a088015215159081611bbc575b50611b515750610f2192519485947fe0cff05f00000000000000000000000000000000000000000000000000000000865260048601612cbd565b9190610f2193611b60846154dc565b611b87611b6b610619565b73ffffffffffffffffffffffffffffffffffffffff9096168652565b6020850152519586957ffaecb4e400000000000000000000000000000000000000000000000000000000875260048701612c2b565b90501538611b17565b9150506154dc565b50346103595760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595773ffffffffffffffffffffffffffffffffffffffff600435611c1e81610422565b16600052600060205260a0604060002065ffffffffffff60018254920154604051926dffffffffffffffffffffffffffff90818116855260ff8160701c161515602086015260781c16604084015263ffffffff8116606084015260201c166080820152f35b60209067ffffffffffffffff8111611c9d575b60051b0190565b611ca5610505565b611c96565b60405190611cb782610535565b604051608083610100830167ffffffffffffffff811184821017611d20575b60405260009283815283602082015283604082015283606082015283838201528360a08201528360c08201528360e082015281528260208201528260408201528260608201520152565b611d28610505565b611cd6565b90611d3782611c83565b611d4460405191826105ab565b8281527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0611d728294611c83565b019060005b828110611d8357505050565b602090611d8e611caa565b82828501015201611d77565b507f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020918151811015611ddf575b60051b010190565b611de7611d9a565b611dd7565b9190811015611e2d575b60051b810135907ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffea181360301821215610359570190565b611e35611d9a565b611df6565b6002805414611e495760028055565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152fd5b3d15611ed2573d90611eb882610639565b91611ec660405193846105ab565b82523d6000602084013e565b606090565b73ffffffffffffffffffffffffffffffffffffffff168015611f6a57600080809381935af1611f04611ea7565b5015611f0c57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f41413931206661696c65642073656e6420746f2062656e6566696369617279006044820152fd5b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f4141393020696e76616c69642062656e656669636961727900000000000000006044820152fd5b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610359570180359067ffffffffffffffff82116103595760200191813603831361035957565b90816020910312610359575190565b601f82602094937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0938186528686013760008582860101520116010190565b60005b83811061207a5750506000910152565b818101518382015260200161206a565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f6020936120c681518092818752878088019101612067565b0116010190565b906120e76080916108b796946101c0808652850191612028565b9360e0815173ffffffffffffffffffffffffffffffffffffffff80825116602087015260208201516040870152604082015160608701526060820151858701528482015160a087015260a08201511660c086015260c081015182860152015161010084015260208101516101208401526040810151610140840152606081015161016084015201516101808201526101a081840391015261208a565b506040513d6000823e3d90fd5b507f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b919082039182116121cd57565b61044d612190565b919082018092116121cd57565b905a918160206121fb6060830151936060810190611fc8565b906122348560405195869485947f1d732756000000000000000000000000000000000000000000000000000000008652600486016120cd565b03816000305af16000918161230f575b50612308575060206000803e7fdeaddead000000000000000000000000000000000000000000000000000000006000511461229b5761229561228a6108b7945a906121c0565b6080840151906121d5565b91614afc565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152600f60408201527f41413935206f7574206f6620676173000000000000000000000000000000000060608201520190565b9250505090565b61233191925060203d8111612338575b61232981836105ab565b810190612019565b9038612244565b503d61231f565b909291925a9380602061235b6060830151946060810190611fc8565b906123948660405195869485947f1d732756000000000000000000000000000000000000000000000000000000008652600486016120cd565b03816000305af160009181612471575b5061246a575060206000803e7fdeaddead00000000000000000000000000000000000000000000000000000000600051146123fc576123f66123eb6108b795965a906121c0565b6080830151906121d5565b92614ddf565b610f21836040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152600f60408201527f41413935206f7574206f6620676173000000000000000000000000000000000060608201520190565b9450505050565b61248a91925060203d81116123385761232981836105ab565b90386123a4565b6001907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146124bf570190565b6124c7612190565b0190565b919081101561250c575b60051b810135907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa181360301821215610359570190565b612514611d9a565b6124d5565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610359570180359067ffffffffffffffff821161035957602001918160051b3603831361035957565b356108b781610422565b1561257e57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4141393620696e76616c69642061676772656761746f720000000000000000006044820152fd5b90357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18236030181121561035957016020813591019167ffffffffffffffff821161035957813603831361035957565b6108b7916126578161263d8461045c565b73ffffffffffffffffffffffffffffffffffffffff169052565b602082013560208201526126f26126a361268861267760408601866125dc565b610160806040880152860191612028565b61269560608601866125dc565b908583036060870152612028565b6080840135608084015260a084013560a084015260c084013560c084015260e084013560e084015261010080850135908401526101206126e5818601866125dc565b9185840390860152612028565b9161270361014091828101906125dc565b929091818503910152612028565b949391929083604087016040885252606086019360608160051b8801019482600090815b848310612754575050505050508460206108b795968503910152612028565b9091929394977fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa08b820301855288357ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffea1843603018112156127cf57600191846127bd920161262c565b98602090810196950193019190612735565b8280fd5b908092918237016000815290565b9290936108b796959260c0958552602085015265ffffffffffff8092166040850152166060830152151560808201528160a0820152019061208a565b1561282457565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4141393220696e7465726e616c2063616c6c206f6e6c790000000000000000006044820152fd5b9060406108b79260008152816020820152019061208a565b6040906108b793928152816020820152019061208a565b909291925a936128c230331461281d565b8151946040860151955a6113886060830151890101116129e2576108b7966000958051612909575b50505090612903915a9003608084015101943691610682565b91615047565b612938916129349161292f855173ffffffffffffffffffffffffffffffffffffffff1690565b615c12565b1590565b612944575b80806128ea565b61290392919450612953615c24565b908151612967575b5050600193909161293d565b7f1c4fada7374c0a9ee8841fc38afe82932dc0f8e69012e927f061a8bae611a20173ffffffffffffffffffffffffffffffffffffffff6020870151926129d860206129c6835173ffffffffffffffffffffffffffffffffffffffff1690565b9201519560405193849316968361289a565b0390a3388061295b565b7fdeaddead0000000000000000000000000000000000000000000000000000000060005260206000fd5b612a22612a1c6040830183611fc8565b90615c07565b90612a33612a1c6060830183611fc8565b90612ae9612a48612a1c610120840184611fc8565b60405194859360208501956101008201359260e08301359260c08101359260a08201359260808301359273ffffffffffffffffffffffffffffffffffffffff60208201359135168c9693909a9998959261012098959273ffffffffffffffffffffffffffffffffffffffff6101408a019d168952602089015260408801526060870152608086015260a085015260c084015260e08301526101008201520152565b0391612b1b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0938481018352826105ab565b51902060408051602081019283523091810191909152466060820152608092830181529091612b4a90826105ab565b51902090565b604051906040820182811067ffffffffffffffff821117612b7b575b60405260006020838281520152565b612b83610505565b612b6c565b906014116103595790601490565b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000009035818116939260148110612bcb57505050565b60140360031b82901b16169150565b9060c060a06108b793805184526020810151602085015260408101511515604085015265ffffffffffff80606083015116606086015260808201511660808501520151918160a0820152019061208a565b9294612c8c61044d95612c7a610100959998612c68612c54602097610140808c528b0190612bda565b9b878a019060208091805184520151910152565b80516060890152602001516080880152565b805160a08701526020015160c0860152565b73ffffffffffffffffffffffffffffffffffffffff81511660e0850152015191019060208091805184520151910152565b612d0661044d94612cf4612cdf60a0959998969960e0865260e0860190612bda565b98602085019060208091805184520151910152565b80516060840152602001516080830152565b019060208091805184520151910152565b9081602091031261035957516108b781610422565b9160206108b7938181520191612028565b90612d6c73ffffffffffffffffffffffffffffffffffffffff916108b797959694606085526060850191612028565b941660208201526040818503910152612028565b60009060033d11612d8d57565b905060046000803e60005160e01c90565b600060443d106108b7576040517ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc91823d016004833e815167ffffffffffffffff918282113d602484011117612e1a57818401948551938411612e22573d85010160208487010111612e1a57506108b7929101602001906105ab565b949350505050565b50949350505050565b612e386040820182611fc8565b612e50612e448461256d565b93610120810190611fc8565b9290303b1561035957600093612e949160405196879586957f957122ab00000000000000000000000000000000000000000000000000000000875260048701612d3d565b0381305afa9081612f1d575b5061044d576001612eaf612d80565b6308c379a014612ec8575b612ec057565b61044d612183565b612ed0612d9e565b80612edc575b50612eba565b80516000925015612ed657610f21906040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301612882565b80610f48612f2a9261057b565b38612ea0565b9190612f3b9061317f565b73ffffffffffffffffffffffffffffffffffffffff929183166130da5761306c57612f659061317f565b9116612ffe57612f725750565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152602160448201527f41413332207061796d61737465722065787069726564206f72206e6f7420647560648201527f6500000000000000000000000000000000000000000000000000000000000000608482015260a490fd5b610f21826040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601460408201527f41413334207369676e6174757265206572726f7200000000000000000000000060608201520190565b610f21836040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601760408201527f414132322065787069726564206f72206e6f742064756500000000000000000060608201520190565b610f21846040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601460408201527f41413234207369676e6174757265206572726f7200000000000000000000000060608201520190565b9291906131549061317f565b909273ffffffffffffffffffffffffffffffffffffffff808095169116036130da5761306c57612f65905b80156131d25761318e9061535f565b73ffffffffffffffffffffffffffffffffffffffff65ffffffffffff8060408401511642119081156131c2575b5091511691565b90506020830151164210386131bb565b50600090600090565b156131e257565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f41413934206761732076616c756573206f766572666c6f7700000000000000006044820152fd5b916000915a9381519061325382826136b3565b61325c81612a0c565b602084015261329a6effffffffffffffffffffffffffffff60808401516060850151176040850151176101008401359060e0850135171711156131db565b6132a382613775565b6132ae818584613836565b97906132df6129346132d4875173ffffffffffffffffffffffffffffffffffffffff1690565b60208801519061546c565b6133db576132ec43600052565b73ffffffffffffffffffffffffffffffffffffffff61332460a0606097015173ffffffffffffffffffffffffffffffffffffffff1690565b166133c1575b505a810360a0840135106133545760809360c092604087015260608601525a900391013501910152565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601e60408201527f41413430206f76657220766572696669636174696f6e4761734c696d6974000060608201520190565b909350816133d2929750858461455c565b9590923861332a565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601a60408201527f4141323520696e76616c6964206163636f756e74206e6f6e636500000000000060608201520190565b9290916000925a825161345b81846136b3565b61346483612a0c565b60208501526134a26effffffffffffffffffffffffffffff60808301516060840151176040840151176101008601359060e0870135171711156131db565b6134ab81613775565b6134b78186868b613ba2565b98906134e86129346134dd865173ffffffffffffffffffffffffffffffffffffffff1690565b60208701519061546c565b6135e0576134f543600052565b73ffffffffffffffffffffffffffffffffffffffff61352d60a0606096015173ffffffffffffffffffffffffffffffffffffffff1690565b166135c5575b505a840360a08601351061355f5750604085015260608401526080919060c0905a900391013501910152565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152601e60448201527f41413430206f76657220766572696669636174696f6e4761734c696d697400006064820152608490fd5b909250816135d79298508686856147ef565b96909138613533565b610f21826040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601a60408201527f4141323520696e76616c6964206163636f756e74206e6f6e636500000000000060608201520190565b1561365557565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f4141393320696e76616c6964207061796d6173746572416e64446174610000006044820152fd5b613725906136dd6136c38261256d565b73ffffffffffffffffffffffffffffffffffffffff168452565b602081013560208401526080810135604084015260a0810135606084015260c0810135608084015260e081013560c084015261010081013560e0840152610120810190611fc8565b90811561376a5761374f61124c6112468460a09461374a601461044d9998101561364e565b612b88565b73ffffffffffffffffffffffffffffffffffffffff16910152565b505060a06000910152565b60a081015173ffffffffffffffffffffffffffffffffffffffff16156137b75760c060035b60ff60408401519116606084015102016080830151019101510290565b60c0600161379a565b6137d86040929594939560608352606083019061262c565b9460208201520152565b9061044d602f60405180947f414132332072657665727465643a20000000000000000000000000000000000060208301526138268151809260208686019101612067565b810103600f8101855201836105ab565b916000926000925a936139046020835193613865855173ffffffffffffffffffffffffffffffffffffffff1690565b9561387d6138766040830183611fc8565b9084613e0d565b60a086015173ffffffffffffffffffffffffffffffffffffffff16906138a243600052565b85809373ffffffffffffffffffffffffffffffffffffffff809416159889613b3a575b60600151908601516040517f3a871cdd0000000000000000000000000000000000000000000000000000000081529788968795869390600485016137c0565b03938a1690f1829181613b1a575b50613b115750600190613923612d80565b6308c379a014613abd575b50613a50575b613941575b50505a900391565b61396b9073ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b613986610a2c82546dffffffffffffffffffffffffffff1690565b8083116139e3576139dc926dffffffffffffffffffffffffffff9103166dffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffff0000000000000000000000000000825416179055565b3880613939565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601760408201527f41413231206469646e2774207061792070726566756e6400000000000000000060608201520190565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601660408201527f4141323320726576657274656420286f72204f4f47290000000000000000000060608201520190565b613ac5612d9e565b9081613ad1575061392e565b610f2191613adf91506137e2565b6040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301612882565b95506139349050565b613b3391925060203d81116123385761232981836105ab565b9038613912565b9450613b80610a2c613b6c8c73ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b546dffffffffffffffffffffffffffff1690565b8b811115613b975750856060835b969150506138c5565b606087918d03613b8e565b90926000936000935a94613beb6020835193613bd2855173ffffffffffffffffffffffffffffffffffffffff1690565b9561387d613be36040830183611fc8565b90848c61412b565b03938a1690f1829181613ded575b50613de45750600190613c0a612d80565b6308c379a014613d8e575b50613d20575b613c29575b5050505a900391565b613c539073ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b91613c6f610a2c84546dffffffffffffffffffffffffffff1690565b90818311613cba575082547fffffffffffffffffffffffffffffffffffff0000000000000000000000000000169190036dffffffffffffffffffffffffffff16179055388080613c20565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152601760448201527f41413231206469646e2774207061792070726566756e640000000000000000006064820152608490fd5b610f21846040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601660408201527f4141323320726576657274656420286f72204f4f47290000000000000000000060608201520190565b613d96612d9e565b9081613da25750613c15565b8691613dae91506137e2565b90610f216040519283927f220266b60000000000000000000000000000000000000000000000000000000084526004840161289a565b9650613c1b9050565b613e0691925060203d81116123385761232981836105ab565b9038613bf9565b909180613e1957505050565b81515173ffffffffffffffffffffffffffffffffffffffff1692833b6140be57606083510151604051907f570e1a3600000000000000000000000000000000000000000000000000000000825260208280613e78878760048401612d2c565b0381600073ffffffffffffffffffffffffffffffffffffffff95867f00000000000000000000000000000000000000000000000000000000000000001690f19182156140b1575b600092614091575b508082169586156140245716809503613fb7573b15613f4a5761124c6112467fd51a9c61267aa6196961883ecf5ff2da6619c37dac0fa92122513fb32c032d2d93613f1193612b88565b602083810151935160a001516040805173ffffffffffffffffffffffffffffffffffffffff9485168152939091169183019190915290a3565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152602060408201527f4141313520696e6974436f6465206d757374206372656174652073656e64657260608201520190565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152602060408201527f4141313420696e6974436f6465206d7573742072657475726e2073656e64657260608201520190565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601b60408201527f4141313320696e6974436f6465206661696c6564206f72204f4f47000000000060608201520190565b6140aa91925060203d811161146a5761145b81836105ab565b9038613ec7565b6140b9612183565b613ebf565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601f60408201527f414131302073656e64657220616c726561647920636f6e73747275637465640060608201520190565b9290918161413a575b50505050565b82515173ffffffffffffffffffffffffffffffffffffffff1693843b6143e257606084510151604051907f570e1a3600000000000000000000000000000000000000000000000000000000825260208280614199888860048401612d2c565b0381600073ffffffffffffffffffffffffffffffffffffffff95867f00000000000000000000000000000000000000000000000000000000000000001690f19182156143d5575b6000926143b5575b5080821696871561434757168096036142d9573b15614273575061124c6112467fd51a9c61267aa6196961883ecf5ff2da6619c37dac0fa92122513fb32c032d2d9361423393612b88565b602083810151935160a001516040805173ffffffffffffffffffffffffffffffffffffffff9485168152939091169183019190915290a338808080614134565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152602060448201527f4141313520696e6974436f6465206d757374206372656174652073656e6465726064820152608490fd5b610f21826040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152602060408201527f4141313420696e6974436f6465206d7573742072657475726e2073656e64657260608201520190565b610f21846040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601b60408201527f4141313320696e6974436f6465206661696c6564206f72204f4f47000000000060608201520190565b6143ce91925060203d811161146a5761145b81836105ab565b90386141e8565b6143dd612183565b6141e0565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152601f60448201527f414131302073656e64657220616c726561647920636f6e7374727563746564006064820152608490fd5b1561444f57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f4141343120746f6f206c6974746c6520766572696669636174696f6e476173006044820152fd5b919060408382031261035957825167ffffffffffffffff81116103595783019080601f83011215610359578151916144e483610639565b916144f260405193846105ab565b838352602084830101116103595760209261451291848085019101612067565b92015190565b9061044d602f60405180947f414133332072657665727465643a20000000000000000000000000000000000060208301526138268151809260208686019101612067565b93919260609460009460009380519261459b60a08a86015195614580888811614448565b015173ffffffffffffffffffffffffffffffffffffffff1690565b916145c68373ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b946145e2610a2c87546dffffffffffffffffffffffffffff1690565b968588106147825773ffffffffffffffffffffffffffffffffffffffff60208a98946146588a966dffffffffffffffffffffffffffff8b6146919e03166dffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffff0000000000000000000000000000825416179055565b015194604051998a98899788937ff465c77e000000000000000000000000000000000000000000000000000000008552600485016137c0565b0395169103f190818391849361475c575b506147555750506001906146b4612d80565b6308c379a014614733575b506146c657565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601660408201527f4141333320726576657274656420286f72204f4f47290000000000000000000060608201520190565b61473b612d9e565b908161474757506146bf565b610f2191613adf9150614518565b9450925050565b90925061477b91503d8085833e61477381836105ab565b8101906144ad565b91386146a2565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601e60408201527f41413331207061796d6173746572206465706f73697420746f6f206c6f77000060608201520190565b91949293909360609560009560009382519061481660a08b84015193614580848611614448565b936148418573ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b61485c610a2c82546dffffffffffffffffffffffffffff1690565b8781106149b7579273ffffffffffffffffffffffffffffffffffffffff60208a989693946146588a966dffffffffffffffffffffffffffff8d6148d69e9c9a03166dffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffff0000000000000000000000000000825416179055565b0395169103f1908183918493614999575b506149915750506001906148f9612d80565b6308c379a014614972575b5061490c5750565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152601660448201527f4141333320726576657274656420286f72204f4f4729000000000000000000006064820152608490fd5b61497a612d9e565b90816149865750614904565b613dae925050614518565b955093505050565b9092506149b091503d8085833e61477381836105ab565b91386148e7565b610f218a6040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601e60408201527f41413331207061796d6173746572206465706f73697420746f6f206c6f77000060608201520190565b60031115614a2f57565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b929190614a7c6040916002865260606020870152606086019061208a565b930152565b939291906003811015614a2f57604091614a7c91865260606020870152606086019061208a565b9061044d603660405180947f4141353020706f73744f702072657665727465643a20000000000000000000006020830152614aec8151809260208686019101612067565b81010360168101855201836105ab565b929190925a93600091805191614b1183615318565b9260a0810195614b35875173ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff93908481169081614ca457505050614b76825173ffffffffffffffffffffffffffffffffffffffff1690565b985b5a90030193840297604084019089825110614c37577f49628fd1471006c1482da88028e9ce4dbb080b815c9b0344d39e5a8e6ec1419f94614bc26020928c614c329551039061553a565b015194896020614c04614be9865173ffffffffffffffffffffffffffffffffffffffff1690565b9a5173ffffffffffffffffffffffffffffffffffffffff1690565b9401519785604051968796169a16988590949392606092608083019683521515602083015260408201520152565b0390a4565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152602060408201527f414135312070726566756e642062656c6f772061637475616c476173436f737460608201520190565b9a918051614cb4575b5050614b78565b6060850151600099509091803b15614ddb579189918983614d07956040518097819682957fa9a234090000000000000000000000000000000000000000000000000000000084528c029060048401614a5e565b0393f19081614dc8575b50614dc3576001614d20612d80565b6308c379a014614da4575b614d37575b3880614cad565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601260408201527f4141353020706f73744f7020726576657274000000000000000000000000000060608201520190565b614dac612d9e565b80614db75750614d2b565b613adf610f2191614aa8565b614d30565b80610f48614dd59261057b565b38614d11565b8980fd5b9392915a90600092805190614df382615318565b9360a0830196614e17885173ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff95908681169081614f0d57505050614e58845173ffffffffffffffffffffffffffffffffffffffff1690565b915b5a9003019485029860408301908a825110614ea757507f49628fd1471006c1482da88028e9ce4dbb080b815c9b0344d39e5a8e6ec1419f949392614bc2614c32938c60209451039061553a565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152602060448201527f414135312070726566756e642062656c6f772061637475616c476173436f73746064820152608490fd5b93918051614f1d575b5050614e5a565b606087015160009a509091803b1561504357918a918a83614f70956040518097819682957fa9a234090000000000000000000000000000000000000000000000000000000084528c029060048401614a5e565b0393f19081615030575b5061502b576001614f89612d80565b6308c379a01461500e575b614fa0575b3880614f16565b610f218b6040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601260408201527f4141353020706f73744f7020726576657274000000000000000000000000000060608201520190565b615016612d9e565b806150215750614f94565b613dae8d91614aa8565b614f99565b80610f4861503d9261057b565b38614f7a565b8a80fd5b909392915a9480519161505983615318565b9260a081019561507d875173ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff938185169182615165575050506150bd825173ffffffffffffffffffffffffffffffffffffffff1690565b985b5a90030193840297604084019089825110614c37577f49628fd1471006c1482da88028e9ce4dbb080b815c9b0344d39e5a8e6ec1419f946151096020928c614c329551039061553a565b61511288614a25565b015194896020615139614be9865173ffffffffffffffffffffffffffffffffffffffff1690565b940151604080519182529815602082015297880152606087015290821695909116939081906080820190565b9a918151615175575b50506150bf565b8784026151818a614a25565b60028a1461520c576060860151823b15610359576151d493600080948d604051978896879586937fa9a2340900000000000000000000000000000000000000000000000000000000855260048501614a81565b0393f180156151ff575b6151ec575b505b388061516e565b80610f486151f99261057b565b386151e3565b615207612183565b6151de565b6060860151823b156103595761525793600080948d604051978896879586937fa9a2340900000000000000000000000000000000000000000000000000000000855260048501614a81565b0393f19081615305575b50615300576001615270612d80565b6308c379a0146152ed575b156151e5576040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601260408201527f4141353020706f73744f7020726576657274000000000000000000000000000060608201520190565b6152f5612d9e565b80614db7575061527b565b6151e5565b80610f486153129261057b565b38615261565b60e060c082015191015180821461533c57480180821015615337575090565b905090565b5090565b6040519061534d8261058f565b60006040838281528260208201520152565b615367615340565b5065ffffffffffff808260a01c1680156153b3575b604051926153898461058f565b73ffffffffffffffffffffffffffffffffffffffff8116845260d01c602084015216604082015290565b508061537c565b6153cf6153d5916153c9615340565b5061535f565b9161535f565b9073ffffffffffffffffffffffffffffffffffffffff9182825116928315615461575b65ffffffffffff928391826040816020850151169301511693836040816020840151169201511690808410615459575b50808511615451575b506040519561543f8761058f565b16855216602084015216604082015290565b935038615431565b925038615428565b8151811693506153f8565b73ffffffffffffffffffffffffffffffffffffffff16600052600160205267ffffffffffffffff6154c88260401c60406000209077ffffffffffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b918254926154d584612491565b9055161490565b9073ffffffffffffffffffffffffffffffffffffffff6154fa612b50565b9216600052600060205263ffffffff600160406000206dffffffffffffffffffffffffffff815460781c1685520154166020830152565b61044d3361562b565b73ffffffffffffffffffffffffffffffffffffffff16600052600060205260406000206dffffffffffffffffffffffffffff8082541692830180931161561e575b8083116155c05761044d92166dffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffff0000000000000000000000000000825416179055565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f6465706f736974206f766572666c6f77000000000000000000000000000000006044820152fd5b615626612190565b61557b565b73ffffffffffffffffffffffffffffffffffffffff9061564b348261553a565b168060005260006020527f2da466a7b24304f47e87fa2e1e5a81b9831ce54fec19055ce277ca2f39ba42c460206dffffffffffffffffffffffffffff60406000205416604051908152a2565b1561569e57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f6d757374207370656369667920756e7374616b652064656c61790000000000006044820152fd5b1561570357565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f63616e6e6f7420646563726561736520756e7374616b652074696d65000000006044820152fd5b1561576857565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f6e6f207374616b652073706563696669656400000000000000000000000000006044820152fd5b156157cd57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f7374616b65206f766572666c6f770000000000000000000000000000000000006044820152fd5b9065ffffffffffff6080600161044d9461588b6dffffffffffffffffffffffffffff86511682906dffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffff0000000000000000000000000000825416179055565b602085015115156eff000000000000000000000000000082549160701b16807fffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffff83161783557fffffff000000000000000000000000000000ffffffffffffffffffffffffffff7cffffffffffffffffffffffffffff000000000000000000000000000000604089015160781b16921617178155019263ffffffff6060820151167fffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000008554161784550151167fffffffffffffffffffffffffffffffffffffffffffff000000000000ffffffff69ffffffffffff0000000083549260201b169116179055565b1561599657565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f616c726561647920756e7374616b696e670000000000000000000000000000006044820152fd5b91909165ffffffffffff808094169116019182116121cd57565b15615a1557565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f4e6f207374616b6520746f2077697468647261770000000000000000000000006044820152fd5b15615a7a57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f6d7573742063616c6c20756e6c6f636b5374616b6528292066697273740000006044820152fd5b15615adf57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f5374616b65207769746864726177616c206973206e6f742064756500000000006044820152fd5b15615b4457565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f6661696c656420746f207769746864726177207374616b6500000000000000006044820152fd5b15615ba957565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f6661696c656420746f20776974686472617700000000000000000000000000006044820152fd5b816040519182372090565b9060009283809360208451940192f190565b3d610800808211615c4b575b50604051906020818301016040528082526000602083013e90565b905038615c3056fea2646970667358221220a706d8b02d7086d80e9330811f5af84b2614abdc5e9a1f2260126070a31d7cee64736f6c634300081100336080806040523461001657610210908161001c8239f35b600080fdfe6080604052600436101561001257600080fd5b6000803560e01c63570e1a361461002857600080fd5b346100c95760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100c95760043567ffffffffffffffff918282116100c957366023830112156100c95781600401359283116100c95736602484840101116100c9576100c561009e84602485016100fc565b60405173ffffffffffffffffffffffffffffffffffffffff90911681529081906020820190565b0390f35b80fd5b507f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b90806014116101bb5767ffffffffffffffff917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec82018381116101cd575b604051937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f81600b8701160116850190858210908211176101c0575b604052808452602084019036848401116101bb576020946000600c819682946014880187378301015251923560601c5af19060005191156101b557565b60009150565b600080fd5b6101c86100cc565b610178565b6101d56100cc565b61013a56fea26469706673582212201927e80b76ab9b71c952137dd676621a9fdf520c25928815636594036eb1c40364736f6c63430008110033", - "deployedBytecode": "0x60806040526004361015610023575b361561001957600080fd5b610021615531565b005b60003560e01c80630396cb60146101b35780630bd28e3b146101aa5780631b2e01b8146101a15780631d732756146101985780631fad948c1461018f578063205c28781461018657806335567e1a1461017d5780634b1d7cf5146101745780635287ce121461016b57806370a08231146101625780638f41ec5a14610159578063957122ab146101505780639b249f6914610147578063a61935311461013e578063b760faf914610135578063bb9fe6bf1461012c578063c23a5cea14610123578063d6383f941461011a578063ee219423146101115763fc7e286d0361000e5761010c611bcd565b61000e565b5061010c6119b5565b5061010c61184d565b5061010c6116b4565b5061010c611536565b5061010c6114f7565b5061010c6114d6565b5061010c611337565b5061010c611164565b5061010c611129565b5061010c6110a4565b5061010c610f54565b5061010c610bf8565b5061010c610b33565b5061010c610994565b5061010c6108ba565b5061010c6106e7565b5061010c610467565b5061010c610385565b5060207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595760043563ffffffff8116808203610359576103547fa5ae833d0bb1dcd632d98a8b70973e8516812898e19bf27b70071ebc8dc52c01916102716102413373ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b9161024d811515615697565b61026a610261600185015463ffffffff1690565b63ffffffff1690565b11156156fc565b54926103366dffffffffffffffffffffffffffff946102f461029834888460781c166121d5565b966102a4881515615761565b6102b0818911156157c6565b6102d4816102bc6105ec565b941684906dffffffffffffffffffffffffffff169052565b6001602084015287166dffffffffffffffffffffffffffff166040830152565b63ffffffff83166060820152600060808201526103313373ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b61582b565b6040805194855263ffffffff90911660208501523393918291820190565b0390a2005b600080fd5b6024359077ffffffffffffffffffffffffffffffffffffffffffffffff8216820361035957565b50346103595760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595760043577ffffffffffffffffffffffffffffffffffffffffffffffff81168103610359576104149033600052600160205260406000209077ffffffffffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b61041e8154612491565b9055005b73ffffffffffffffffffffffffffffffffffffffff81160361035957565b6024359061044d82610422565b565b60c4359061044d82610422565b359061044d82610422565b50346103595760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595760206104fc6004356104a881610422565b73ffffffffffffffffffffffffffffffffffffffff6104c561035e565b91166000526001835260406000209077ffffffffffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b54604051908152f35b507f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60a0810190811067ffffffffffffffff82111761055157604052565b610559610505565b604052565b610100810190811067ffffffffffffffff82111761055157604052565b67ffffffffffffffff811161055157604052565b6060810190811067ffffffffffffffff82111761055157604052565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761055157604052565b6040519061044d82610535565b6040519060c0820182811067ffffffffffffffff82111761055157604052565b604051906040820182811067ffffffffffffffff82111761055157604052565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f60209267ffffffffffffffff8111610675575b01160190565b61067d610505565b61066f565b92919261068e82610639565b9161069c60405193846105ab565b829481845281830111610359578281602093846000960137010152565b9181601f840112156103595782359167ffffffffffffffff8311610359576020838186019501011161035957565b5034610359576101c07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595767ffffffffffffffff60043581811161035957366023820112156103595761074a903690602481600401359101610682565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc36016101808112610359576101006040519161078783610535565b12610359576040516107988161055e565b6107a0610440565b815260443560208201526064356040820152608435606082015260a43560808201526107ca61044f565b60a082015260e43560c08201526101043560e082015281526101243560208201526101443560408201526101643560608201526101843560808201526101a4359182116103595761083e9261082661082e9336906004016106b9565b9290916128b1565b6040519081529081906020820190565b0390f35b9060407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8301126103595760043567ffffffffffffffff9283821161035957806023830112156103595781600401359384116103595760248460051b830101116103595760240191906024356108b781610422565b90565b5034610359576108c936610842565b6108d4929192611e3a565b6108dd83611d2d565b60005b84811061095d57506000927fbb47ee3e183a558b1a2ff0874b079f3fc5478b7454eacf2bfc5af2ff5878f9728480a183915b85831061092d576109238585611ed7565b6100216001600255565b909193600190610953610941878987611dec565b61094b8886611dca565b51908861233f565b0194019190610912565b8061098b610984610972600194869896611dca565b5161097e848a88611dec565b84613448565b9083612f30565b019290926108e0565b50346103595760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610359576004356109d081610422565b6024359060009133835282602052604083206dffffffffffffffffffffffffffff81541692838311610ad557848373ffffffffffffffffffffffffffffffffffffffff829593610a788496610a3f610a2c8798610ad29c6121c0565b6dffffffffffffffffffffffffffff1690565b6dffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffff0000000000000000000000000000825416179055565b6040805173ffffffffffffffffffffffffffffffffffffffff831681526020810185905233917fd1c19fbcd4551a5edfb66d43d2e337c04837afda3482b42bdf569a8fccdae5fb91a2165af1610acc611ea7565b50615ba2565b80f35b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f576974686472617720616d6f756e7420746f6f206c61726765000000000000006044820152fd5b50346103595760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610359576020600435610b7181610422565b73ffffffffffffffffffffffffffffffffffffffff610b8e61035e565b911660005260018252610bc98160406000209077ffffffffffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000006040519260401b16178152f35b503461035957610c0736610842565b610c0f611e3a565b6000805b838210610df657610c249150611d2d565b7fbb47ee3e183a558b1a2ff0874b079f3fc5478b7454eacf2bfc5af2ff5878f972600080a16000805b848110610d5c57505060008093815b818110610c9357610923868660007f575ff3acadd5ab348fe1855e217e0f3678f8d767d7494c9f9fefbee2e17cca4d8180a2611ed7565b610cf7610ca182848a6124cb565b610ccc610cb3610cb36020840161256d565b73ffffffffffffffffffffffffffffffffffffffff1690565b7f575ff3acadd5ab348fe1855e217e0f3678f8d767d7494c9f9fefbee2e17cca4d600080a280612519565b906000915b808310610d1457505050610d0f90612491565b610c5c565b90919497610d4f610d49610d5592610d438c8b610d3c82610d368e8b8d611dec565b92611dca565b519161233f565b906121d5565b99612491565b95612491565b9190610cfc565b610d678186886124cb565b6020610d7f610d768380612519565b9290930161256d565b9173ffffffffffffffffffffffffffffffffffffffff60009316905b828410610db45750505050610daf90612491565b610c4d565b90919294610d4f81610de985610de2610dd0610dee968d611dca565b51610ddc8c8b8a611dec565b85613448565b908b613148565b612491565b929190610d9b565b610e018285876124cb565b90610e0c8280612519565b92610e1c610cb36020830161256d565b9173ffffffffffffffffffffffffffffffffffffffff8316610e416001821415612577565b610e62575b505050610e5c91610e56916121d5565b91612491565b90610c13565b909592610e7b6040999693999895989788810190611fc8565b92908a3b156103595789938b918a5193849283927fe3563a4f00000000000000000000000000000000000000000000000000000000845260049e8f850193610ec294612711565b03815a93600094fa9081610f3b575b50610f255786517f86a9f75000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8a16818a0190815281906020010390fd5b0390fd5b9497509295509093509181610e56610e5c610e46565b80610f48610f4e9261057b565b8061111e565b38610ed1565b50346103595760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595761083e73ffffffffffffffffffffffffffffffffffffffff600435610fa881610422565b608060409283928351610fba81610535565b60009381858093528260208201528287820152826060820152015216815280602052209061104965ffffffffffff6001835194610ff686610535565b80546dffffffffffffffffffffffffffff8082168852607082901c60ff161515602089015260789190911c1685870152015463ffffffff8116606086015260201c16608084019065ffffffffffff169052565b5191829182919091608065ffffffffffff8160a08401956dffffffffffffffffffffffffffff808251168652602082015115156020870152604082015116604086015263ffffffff6060820151166060860152015116910152565b50346103595760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595773ffffffffffffffffffffffffffffffffffffffff6004356110f581610422565b16600052600060205260206dffffffffffffffffffffffffffff60406000205416604051908152f35b600091031261035957565b50346103595760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261035957602060405160018152f35b50346103595760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261035957600467ffffffffffffffff8135818111610359576111b590369084016106b9565b9050602435916111c483610422565b604435908111610359576111db90369085016106b9565b92909115908161132d575b506112c6576014821015611236575b610f21836040519182917f08c379a0000000000000000000000000000000000000000000000000000000008352820160409060208152600060208201520190565b6112466112529261124c92612b88565b90612b96565b60601c90565b3b1561125f5738806111f5565b610f21906040519182917f08c379a0000000000000000000000000000000000000000000000000000000008352820160609060208152601b60208201527f41413330207061796d6173746572206e6f74206465706c6f796564000000000060408201520190565b610f21836040519182917f08c379a0000000000000000000000000000000000000000000000000000000008352820160609060208152601960208201527f41413230206163636f756e74206e6f74206465706c6f7965640000000000000060408201520190565b90503b15386111e6565b50346103595760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595760043567ffffffffffffffff81116103595761138960249136906004016106b9565b906113bf6040519283927f570e1a3600000000000000000000000000000000000000000000000000000000845260048401612d2c565b0360208273ffffffffffffffffffffffffffffffffffffffff92816000857f0000000000000000000000000000000000000000000000000000000000000000165af1918215611471575b600092611441575b50604051917f6ca7b806000000000000000000000000000000000000000000000000000000008352166004820152fd5b61146391925060203d811161146a575b61145b81836105ab565b810190612d17565b9038611411565b503d611451565b611479612183565b611409565b90816101609103126103595790565b60207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc820112610359576004359067ffffffffffffffff8211610359576108b79160040161147e565b50346103595760206114ef6114ea3661148d565b612a0c565b604051908152f35b5060207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595761002160043561153181610422565b61562b565b5034610359576000807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126116b1573381528060205260408120600181019063ffffffff825416908115611653576115f06115b5611618936115a76115a2855460ff9060701c1690565b61598f565b65ffffffffffff42166159f4565b84547fffffffffffffffffffffffffffffffffffffffffffff000000000000ffffffff16602082901b69ffffffffffff000000001617909455565b7fffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffff8154169055565b60405165ffffffffffff91909116815233907ffa9b3c14cc825c412c9ed81b3ba365a5b459439403f18829e572ed53a4180f0a90602090a280f35b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f6e6f74207374616b6564000000000000000000000000000000000000000000006044820152fd5b80fd5b50346103595760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610359576004356116f081610422565b610ad273ffffffffffffffffffffffffffffffffffffffff6117323373ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b926117ea611755610a2c86546dffffffffffffffffffffffffffff9060781c1690565b94611761861515615a0e565b6117c26001820161179a65ffffffffffff611786835465ffffffffffff9060201c1690565b16611792811515615a73565b421015615ad8565b80547fffffffffffffffffffffffffffffffffffffffffffff00000000000000000000169055565b7fffffff0000000000000000000000000000ffffffffffffffffffffffffffffff8154169055565b6040805173ffffffffffffffffffffffffffffffffffffffff831681526020810186905233917fb7c918e0e249f999e965cafeb6c664271b3f4317d296461500e71da39f0cbda391a2600080809581948294165af1611847611ea7565b50615b3d565b50346103595760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595767ffffffffffffffff6004358181116103595761189e90369060040161147e565b602435916118ab83610422565b604435908111610359576118c6610f219136906004016106b9565b6118ce611caa565b6118d785612e2b565b6118ea6118e48287613240565b906153ba565b946118fa826000924384526121e2565b96438252819360609573ffffffffffffffffffffffffffffffffffffffff8316611981575b50505050608001519361194e6040611940602084015165ffffffffffff1690565b92015165ffffffffffff1690565b906040519687967f8b7ac980000000000000000000000000000000000000000000000000000000008852600488016127e1565b8395508394965061199b60409492939451809481936127d3565b03925af19060806119aa611ea7565b92919038808061191f565b5034610359576119c43661148d565b6119cc611caa565b6119d582612e2b565b6119df8183613240565b825160a00151919391611a0c9073ffffffffffffffffffffffffffffffffffffffff166154dc565b6154dc565b90611a30611a07855173ffffffffffffffffffffffffffffffffffffffff90511690565b94611a39612b50565b50611a68611a4c60409586810190611fc8565b90600060148310611bc55750611246611a079261124c92612b88565b91611a72916153ba565b805173ffffffffffffffffffffffffffffffffffffffff169073ffffffffffffffffffffffffffffffffffffffff821660018114916080880151978781015191886020820151611ac79065ffffffffffff1690565b91015165ffffffffffff16916060015192611ae06105f9565b9a8b5260208b0152841515898b015265ffffffffffff1660608a015265ffffffffffff16608089015260a088015215159081611bbc575b50611b515750610f2192519485947fe0cff05f00000000000000000000000000000000000000000000000000000000865260048601612cbd565b9190610f2193611b60846154dc565b611b87611b6b610619565b73ffffffffffffffffffffffffffffffffffffffff9096168652565b6020850152519586957ffaecb4e400000000000000000000000000000000000000000000000000000000875260048701612c2b565b90501538611b17565b9150506154dc565b50346103595760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595773ffffffffffffffffffffffffffffffffffffffff600435611c1e81610422565b16600052600060205260a0604060002065ffffffffffff60018254920154604051926dffffffffffffffffffffffffffff90818116855260ff8160701c161515602086015260781c16604084015263ffffffff8116606084015260201c166080820152f35b60209067ffffffffffffffff8111611c9d575b60051b0190565b611ca5610505565b611c96565b60405190611cb782610535565b604051608083610100830167ffffffffffffffff811184821017611d20575b60405260009283815283602082015283604082015283606082015283838201528360a08201528360c08201528360e082015281528260208201528260408201528260608201520152565b611d28610505565b611cd6565b90611d3782611c83565b611d4460405191826105ab565b8281527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0611d728294611c83565b019060005b828110611d8357505050565b602090611d8e611caa565b82828501015201611d77565b507f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020918151811015611ddf575b60051b010190565b611de7611d9a565b611dd7565b9190811015611e2d575b60051b810135907ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffea181360301821215610359570190565b611e35611d9a565b611df6565b6002805414611e495760028055565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152fd5b3d15611ed2573d90611eb882610639565b91611ec660405193846105ab565b82523d6000602084013e565b606090565b73ffffffffffffffffffffffffffffffffffffffff168015611f6a57600080809381935af1611f04611ea7565b5015611f0c57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f41413931206661696c65642073656e6420746f2062656e6566696369617279006044820152fd5b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f4141393020696e76616c69642062656e656669636961727900000000000000006044820152fd5b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610359570180359067ffffffffffffffff82116103595760200191813603831361035957565b90816020910312610359575190565b601f82602094937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0938186528686013760008582860101520116010190565b60005b83811061207a5750506000910152565b818101518382015260200161206a565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f6020936120c681518092818752878088019101612067565b0116010190565b906120e76080916108b796946101c0808652850191612028565b9360e0815173ffffffffffffffffffffffffffffffffffffffff80825116602087015260208201516040870152604082015160608701526060820151858701528482015160a087015260a08201511660c086015260c081015182860152015161010084015260208101516101208401526040810151610140840152606081015161016084015201516101808201526101a081840391015261208a565b506040513d6000823e3d90fd5b507f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b919082039182116121cd57565b61044d612190565b919082018092116121cd57565b905a918160206121fb6060830151936060810190611fc8565b906122348560405195869485947f1d732756000000000000000000000000000000000000000000000000000000008652600486016120cd565b03816000305af16000918161230f575b50612308575060206000803e7fdeaddead000000000000000000000000000000000000000000000000000000006000511461229b5761229561228a6108b7945a906121c0565b6080840151906121d5565b91614afc565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152600f60408201527f41413935206f7574206f6620676173000000000000000000000000000000000060608201520190565b9250505090565b61233191925060203d8111612338575b61232981836105ab565b810190612019565b9038612244565b503d61231f565b909291925a9380602061235b6060830151946060810190611fc8565b906123948660405195869485947f1d732756000000000000000000000000000000000000000000000000000000008652600486016120cd565b03816000305af160009181612471575b5061246a575060206000803e7fdeaddead00000000000000000000000000000000000000000000000000000000600051146123fc576123f66123eb6108b795965a906121c0565b6080830151906121d5565b92614ddf565b610f21836040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152600f60408201527f41413935206f7574206f6620676173000000000000000000000000000000000060608201520190565b9450505050565b61248a91925060203d81116123385761232981836105ab565b90386123a4565b6001907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146124bf570190565b6124c7612190565b0190565b919081101561250c575b60051b810135907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa181360301821215610359570190565b612514611d9a565b6124d5565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610359570180359067ffffffffffffffff821161035957602001918160051b3603831361035957565b356108b781610422565b1561257e57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4141393620696e76616c69642061676772656761746f720000000000000000006044820152fd5b90357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18236030181121561035957016020813591019167ffffffffffffffff821161035957813603831361035957565b6108b7916126578161263d8461045c565b73ffffffffffffffffffffffffffffffffffffffff169052565b602082013560208201526126f26126a361268861267760408601866125dc565b610160806040880152860191612028565b61269560608601866125dc565b908583036060870152612028565b6080840135608084015260a084013560a084015260c084013560c084015260e084013560e084015261010080850135908401526101206126e5818601866125dc565b9185840390860152612028565b9161270361014091828101906125dc565b929091818503910152612028565b949391929083604087016040885252606086019360608160051b8801019482600090815b848310612754575050505050508460206108b795968503910152612028565b9091929394977fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa08b820301855288357ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffea1843603018112156127cf57600191846127bd920161262c565b98602090810196950193019190612735565b8280fd5b908092918237016000815290565b9290936108b796959260c0958552602085015265ffffffffffff8092166040850152166060830152151560808201528160a0820152019061208a565b1561282457565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4141393220696e7465726e616c2063616c6c206f6e6c790000000000000000006044820152fd5b9060406108b79260008152816020820152019061208a565b6040906108b793928152816020820152019061208a565b909291925a936128c230331461281d565b8151946040860151955a6113886060830151890101116129e2576108b7966000958051612909575b50505090612903915a9003608084015101943691610682565b91615047565b612938916129349161292f855173ffffffffffffffffffffffffffffffffffffffff1690565b615c12565b1590565b612944575b80806128ea565b61290392919450612953615c24565b908151612967575b5050600193909161293d565b7f1c4fada7374c0a9ee8841fc38afe82932dc0f8e69012e927f061a8bae611a20173ffffffffffffffffffffffffffffffffffffffff6020870151926129d860206129c6835173ffffffffffffffffffffffffffffffffffffffff1690565b9201519560405193849316968361289a565b0390a3388061295b565b7fdeaddead0000000000000000000000000000000000000000000000000000000060005260206000fd5b612a22612a1c6040830183611fc8565b90615c07565b90612a33612a1c6060830183611fc8565b90612ae9612a48612a1c610120840184611fc8565b60405194859360208501956101008201359260e08301359260c08101359260a08201359260808301359273ffffffffffffffffffffffffffffffffffffffff60208201359135168c9693909a9998959261012098959273ffffffffffffffffffffffffffffffffffffffff6101408a019d168952602089015260408801526060870152608086015260a085015260c084015260e08301526101008201520152565b0391612b1b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0938481018352826105ab565b51902060408051602081019283523091810191909152466060820152608092830181529091612b4a90826105ab565b51902090565b604051906040820182811067ffffffffffffffff821117612b7b575b60405260006020838281520152565b612b83610505565b612b6c565b906014116103595790601490565b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000009035818116939260148110612bcb57505050565b60140360031b82901b16169150565b9060c060a06108b793805184526020810151602085015260408101511515604085015265ffffffffffff80606083015116606086015260808201511660808501520151918160a0820152019061208a565b9294612c8c61044d95612c7a610100959998612c68612c54602097610140808c528b0190612bda565b9b878a019060208091805184520151910152565b80516060890152602001516080880152565b805160a08701526020015160c0860152565b73ffffffffffffffffffffffffffffffffffffffff81511660e0850152015191019060208091805184520151910152565b612d0661044d94612cf4612cdf60a0959998969960e0865260e0860190612bda565b98602085019060208091805184520151910152565b80516060840152602001516080830152565b019060208091805184520151910152565b9081602091031261035957516108b781610422565b9160206108b7938181520191612028565b90612d6c73ffffffffffffffffffffffffffffffffffffffff916108b797959694606085526060850191612028565b941660208201526040818503910152612028565b60009060033d11612d8d57565b905060046000803e60005160e01c90565b600060443d106108b7576040517ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc91823d016004833e815167ffffffffffffffff918282113d602484011117612e1a57818401948551938411612e22573d85010160208487010111612e1a57506108b7929101602001906105ab565b949350505050565b50949350505050565b612e386040820182611fc8565b612e50612e448461256d565b93610120810190611fc8565b9290303b1561035957600093612e949160405196879586957f957122ab00000000000000000000000000000000000000000000000000000000875260048701612d3d565b0381305afa9081612f1d575b5061044d576001612eaf612d80565b6308c379a014612ec8575b612ec057565b61044d612183565b612ed0612d9e565b80612edc575b50612eba565b80516000925015612ed657610f21906040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301612882565b80610f48612f2a9261057b565b38612ea0565b9190612f3b9061317f565b73ffffffffffffffffffffffffffffffffffffffff929183166130da5761306c57612f659061317f565b9116612ffe57612f725750565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152602160448201527f41413332207061796d61737465722065787069726564206f72206e6f7420647560648201527f6500000000000000000000000000000000000000000000000000000000000000608482015260a490fd5b610f21826040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601460408201527f41413334207369676e6174757265206572726f7200000000000000000000000060608201520190565b610f21836040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601760408201527f414132322065787069726564206f72206e6f742064756500000000000000000060608201520190565b610f21846040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601460408201527f41413234207369676e6174757265206572726f7200000000000000000000000060608201520190565b9291906131549061317f565b909273ffffffffffffffffffffffffffffffffffffffff808095169116036130da5761306c57612f65905b80156131d25761318e9061535f565b73ffffffffffffffffffffffffffffffffffffffff65ffffffffffff8060408401511642119081156131c2575b5091511691565b90506020830151164210386131bb565b50600090600090565b156131e257565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f41413934206761732076616c756573206f766572666c6f7700000000000000006044820152fd5b916000915a9381519061325382826136b3565b61325c81612a0c565b602084015261329a6effffffffffffffffffffffffffffff60808401516060850151176040850151176101008401359060e0850135171711156131db565b6132a382613775565b6132ae818584613836565b97906132df6129346132d4875173ffffffffffffffffffffffffffffffffffffffff1690565b60208801519061546c565b6133db576132ec43600052565b73ffffffffffffffffffffffffffffffffffffffff61332460a0606097015173ffffffffffffffffffffffffffffffffffffffff1690565b166133c1575b505a810360a0840135106133545760809360c092604087015260608601525a900391013501910152565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601e60408201527f41413430206f76657220766572696669636174696f6e4761734c696d6974000060608201520190565b909350816133d2929750858461455c565b9590923861332a565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601a60408201527f4141323520696e76616c6964206163636f756e74206e6f6e636500000000000060608201520190565b9290916000925a825161345b81846136b3565b61346483612a0c565b60208501526134a26effffffffffffffffffffffffffffff60808301516060840151176040840151176101008601359060e0870135171711156131db565b6134ab81613775565b6134b78186868b613ba2565b98906134e86129346134dd865173ffffffffffffffffffffffffffffffffffffffff1690565b60208701519061546c565b6135e0576134f543600052565b73ffffffffffffffffffffffffffffffffffffffff61352d60a0606096015173ffffffffffffffffffffffffffffffffffffffff1690565b166135c5575b505a840360a08601351061355f5750604085015260608401526080919060c0905a900391013501910152565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152601e60448201527f41413430206f76657220766572696669636174696f6e4761734c696d697400006064820152608490fd5b909250816135d79298508686856147ef565b96909138613533565b610f21826040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601a60408201527f4141323520696e76616c6964206163636f756e74206e6f6e636500000000000060608201520190565b1561365557565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f4141393320696e76616c6964207061796d6173746572416e64446174610000006044820152fd5b613725906136dd6136c38261256d565b73ffffffffffffffffffffffffffffffffffffffff168452565b602081013560208401526080810135604084015260a0810135606084015260c0810135608084015260e081013560c084015261010081013560e0840152610120810190611fc8565b90811561376a5761374f61124c6112468460a09461374a601461044d9998101561364e565b612b88565b73ffffffffffffffffffffffffffffffffffffffff16910152565b505060a06000910152565b60a081015173ffffffffffffffffffffffffffffffffffffffff16156137b75760c060035b60ff60408401519116606084015102016080830151019101510290565b60c0600161379a565b6137d86040929594939560608352606083019061262c565b9460208201520152565b9061044d602f60405180947f414132332072657665727465643a20000000000000000000000000000000000060208301526138268151809260208686019101612067565b810103600f8101855201836105ab565b916000926000925a936139046020835193613865855173ffffffffffffffffffffffffffffffffffffffff1690565b9561387d6138766040830183611fc8565b9084613e0d565b60a086015173ffffffffffffffffffffffffffffffffffffffff16906138a243600052565b85809373ffffffffffffffffffffffffffffffffffffffff809416159889613b3a575b60600151908601516040517f3a871cdd0000000000000000000000000000000000000000000000000000000081529788968795869390600485016137c0565b03938a1690f1829181613b1a575b50613b115750600190613923612d80565b6308c379a014613abd575b50613a50575b613941575b50505a900391565b61396b9073ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b613986610a2c82546dffffffffffffffffffffffffffff1690565b8083116139e3576139dc926dffffffffffffffffffffffffffff9103166dffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffff0000000000000000000000000000825416179055565b3880613939565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601760408201527f41413231206469646e2774207061792070726566756e6400000000000000000060608201520190565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601660408201527f4141323320726576657274656420286f72204f4f47290000000000000000000060608201520190565b613ac5612d9e565b9081613ad1575061392e565b610f2191613adf91506137e2565b6040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301612882565b95506139349050565b613b3391925060203d81116123385761232981836105ab565b9038613912565b9450613b80610a2c613b6c8c73ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b546dffffffffffffffffffffffffffff1690565b8b811115613b975750856060835b969150506138c5565b606087918d03613b8e565b90926000936000935a94613beb6020835193613bd2855173ffffffffffffffffffffffffffffffffffffffff1690565b9561387d613be36040830183611fc8565b90848c61412b565b03938a1690f1829181613ded575b50613de45750600190613c0a612d80565b6308c379a014613d8e575b50613d20575b613c29575b5050505a900391565b613c539073ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b91613c6f610a2c84546dffffffffffffffffffffffffffff1690565b90818311613cba575082547fffffffffffffffffffffffffffffffffffff0000000000000000000000000000169190036dffffffffffffffffffffffffffff16179055388080613c20565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152601760448201527f41413231206469646e2774207061792070726566756e640000000000000000006064820152608490fd5b610f21846040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601660408201527f4141323320726576657274656420286f72204f4f47290000000000000000000060608201520190565b613d96612d9e565b9081613da25750613c15565b8691613dae91506137e2565b90610f216040519283927f220266b60000000000000000000000000000000000000000000000000000000084526004840161289a565b9650613c1b9050565b613e0691925060203d81116123385761232981836105ab565b9038613bf9565b909180613e1957505050565b81515173ffffffffffffffffffffffffffffffffffffffff1692833b6140be57606083510151604051907f570e1a3600000000000000000000000000000000000000000000000000000000825260208280613e78878760048401612d2c565b0381600073ffffffffffffffffffffffffffffffffffffffff95867f00000000000000000000000000000000000000000000000000000000000000001690f19182156140b1575b600092614091575b508082169586156140245716809503613fb7573b15613f4a5761124c6112467fd51a9c61267aa6196961883ecf5ff2da6619c37dac0fa92122513fb32c032d2d93613f1193612b88565b602083810151935160a001516040805173ffffffffffffffffffffffffffffffffffffffff9485168152939091169183019190915290a3565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152602060408201527f4141313520696e6974436f6465206d757374206372656174652073656e64657260608201520190565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152602060408201527f4141313420696e6974436f6465206d7573742072657475726e2073656e64657260608201520190565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601b60408201527f4141313320696e6974436f6465206661696c6564206f72204f4f47000000000060608201520190565b6140aa91925060203d811161146a5761145b81836105ab565b9038613ec7565b6140b9612183565b613ebf565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601f60408201527f414131302073656e64657220616c726561647920636f6e73747275637465640060608201520190565b9290918161413a575b50505050565b82515173ffffffffffffffffffffffffffffffffffffffff1693843b6143e257606084510151604051907f570e1a3600000000000000000000000000000000000000000000000000000000825260208280614199888860048401612d2c565b0381600073ffffffffffffffffffffffffffffffffffffffff95867f00000000000000000000000000000000000000000000000000000000000000001690f19182156143d5575b6000926143b5575b5080821696871561434757168096036142d9573b15614273575061124c6112467fd51a9c61267aa6196961883ecf5ff2da6619c37dac0fa92122513fb32c032d2d9361423393612b88565b602083810151935160a001516040805173ffffffffffffffffffffffffffffffffffffffff9485168152939091169183019190915290a338808080614134565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152602060448201527f4141313520696e6974436f6465206d757374206372656174652073656e6465726064820152608490fd5b610f21826040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152602060408201527f4141313420696e6974436f6465206d7573742072657475726e2073656e64657260608201520190565b610f21846040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601b60408201527f4141313320696e6974436f6465206661696c6564206f72204f4f47000000000060608201520190565b6143ce91925060203d811161146a5761145b81836105ab565b90386141e8565b6143dd612183565b6141e0565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152601f60448201527f414131302073656e64657220616c726561647920636f6e7374727563746564006064820152608490fd5b1561444f57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f4141343120746f6f206c6974746c6520766572696669636174696f6e476173006044820152fd5b919060408382031261035957825167ffffffffffffffff81116103595783019080601f83011215610359578151916144e483610639565b916144f260405193846105ab565b838352602084830101116103595760209261451291848085019101612067565b92015190565b9061044d602f60405180947f414133332072657665727465643a20000000000000000000000000000000000060208301526138268151809260208686019101612067565b93919260609460009460009380519261459b60a08a86015195614580888811614448565b015173ffffffffffffffffffffffffffffffffffffffff1690565b916145c68373ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b946145e2610a2c87546dffffffffffffffffffffffffffff1690565b968588106147825773ffffffffffffffffffffffffffffffffffffffff60208a98946146588a966dffffffffffffffffffffffffffff8b6146919e03166dffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffff0000000000000000000000000000825416179055565b015194604051998a98899788937ff465c77e000000000000000000000000000000000000000000000000000000008552600485016137c0565b0395169103f190818391849361475c575b506147555750506001906146b4612d80565b6308c379a014614733575b506146c657565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601660408201527f4141333320726576657274656420286f72204f4f47290000000000000000000060608201520190565b61473b612d9e565b908161474757506146bf565b610f2191613adf9150614518565b9450925050565b90925061477b91503d8085833e61477381836105ab565b8101906144ad565b91386146a2565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601e60408201527f41413331207061796d6173746572206465706f73697420746f6f206c6f77000060608201520190565b91949293909360609560009560009382519061481660a08b84015193614580848611614448565b936148418573ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b61485c610a2c82546dffffffffffffffffffffffffffff1690565b8781106149b7579273ffffffffffffffffffffffffffffffffffffffff60208a989693946146588a966dffffffffffffffffffffffffffff8d6148d69e9c9a03166dffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffff0000000000000000000000000000825416179055565b0395169103f1908183918493614999575b506149915750506001906148f9612d80565b6308c379a014614972575b5061490c5750565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152601660448201527f4141333320726576657274656420286f72204f4f4729000000000000000000006064820152608490fd5b61497a612d9e565b90816149865750614904565b613dae925050614518565b955093505050565b9092506149b091503d8085833e61477381836105ab565b91386148e7565b610f218a6040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601e60408201527f41413331207061796d6173746572206465706f73697420746f6f206c6f77000060608201520190565b60031115614a2f57565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b929190614a7c6040916002865260606020870152606086019061208a565b930152565b939291906003811015614a2f57604091614a7c91865260606020870152606086019061208a565b9061044d603660405180947f4141353020706f73744f702072657665727465643a20000000000000000000006020830152614aec8151809260208686019101612067565b81010360168101855201836105ab565b929190925a93600091805191614b1183615318565b9260a0810195614b35875173ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff93908481169081614ca457505050614b76825173ffffffffffffffffffffffffffffffffffffffff1690565b985b5a90030193840297604084019089825110614c37577f49628fd1471006c1482da88028e9ce4dbb080b815c9b0344d39e5a8e6ec1419f94614bc26020928c614c329551039061553a565b015194896020614c04614be9865173ffffffffffffffffffffffffffffffffffffffff1690565b9a5173ffffffffffffffffffffffffffffffffffffffff1690565b9401519785604051968796169a16988590949392606092608083019683521515602083015260408201520152565b0390a4565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152602060408201527f414135312070726566756e642062656c6f772061637475616c476173436f737460608201520190565b9a918051614cb4575b5050614b78565b6060850151600099509091803b15614ddb579189918983614d07956040518097819682957fa9a234090000000000000000000000000000000000000000000000000000000084528c029060048401614a5e565b0393f19081614dc8575b50614dc3576001614d20612d80565b6308c379a014614da4575b614d37575b3880614cad565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601260408201527f4141353020706f73744f7020726576657274000000000000000000000000000060608201520190565b614dac612d9e565b80614db75750614d2b565b613adf610f2191614aa8565b614d30565b80610f48614dd59261057b565b38614d11565b8980fd5b9392915a90600092805190614df382615318565b9360a0830196614e17885173ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff95908681169081614f0d57505050614e58845173ffffffffffffffffffffffffffffffffffffffff1690565b915b5a9003019485029860408301908a825110614ea757507f49628fd1471006c1482da88028e9ce4dbb080b815c9b0344d39e5a8e6ec1419f949392614bc2614c32938c60209451039061553a565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152602060448201527f414135312070726566756e642062656c6f772061637475616c476173436f73746064820152608490fd5b93918051614f1d575b5050614e5a565b606087015160009a509091803b1561504357918a918a83614f70956040518097819682957fa9a234090000000000000000000000000000000000000000000000000000000084528c029060048401614a5e565b0393f19081615030575b5061502b576001614f89612d80565b6308c379a01461500e575b614fa0575b3880614f16565b610f218b6040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601260408201527f4141353020706f73744f7020726576657274000000000000000000000000000060608201520190565b615016612d9e565b806150215750614f94565b613dae8d91614aa8565b614f99565b80610f4861503d9261057b565b38614f7a565b8a80fd5b909392915a9480519161505983615318565b9260a081019561507d875173ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff938185169182615165575050506150bd825173ffffffffffffffffffffffffffffffffffffffff1690565b985b5a90030193840297604084019089825110614c37577f49628fd1471006c1482da88028e9ce4dbb080b815c9b0344d39e5a8e6ec1419f946151096020928c614c329551039061553a565b61511288614a25565b015194896020615139614be9865173ffffffffffffffffffffffffffffffffffffffff1690565b940151604080519182529815602082015297880152606087015290821695909116939081906080820190565b9a918151615175575b50506150bf565b8784026151818a614a25565b60028a1461520c576060860151823b15610359576151d493600080948d604051978896879586937fa9a2340900000000000000000000000000000000000000000000000000000000855260048501614a81565b0393f180156151ff575b6151ec575b505b388061516e565b80610f486151f99261057b565b386151e3565b615207612183565b6151de565b6060860151823b156103595761525793600080948d604051978896879586937fa9a2340900000000000000000000000000000000000000000000000000000000855260048501614a81565b0393f19081615305575b50615300576001615270612d80565b6308c379a0146152ed575b156151e5576040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601260408201527f4141353020706f73744f7020726576657274000000000000000000000000000060608201520190565b6152f5612d9e565b80614db7575061527b565b6151e5565b80610f486153129261057b565b38615261565b60e060c082015191015180821461533c57480180821015615337575090565b905090565b5090565b6040519061534d8261058f565b60006040838281528260208201520152565b615367615340565b5065ffffffffffff808260a01c1680156153b3575b604051926153898461058f565b73ffffffffffffffffffffffffffffffffffffffff8116845260d01c602084015216604082015290565b508061537c565b6153cf6153d5916153c9615340565b5061535f565b9161535f565b9073ffffffffffffffffffffffffffffffffffffffff9182825116928315615461575b65ffffffffffff928391826040816020850151169301511693836040816020840151169201511690808410615459575b50808511615451575b506040519561543f8761058f565b16855216602084015216604082015290565b935038615431565b925038615428565b8151811693506153f8565b73ffffffffffffffffffffffffffffffffffffffff16600052600160205267ffffffffffffffff6154c88260401c60406000209077ffffffffffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b918254926154d584612491565b9055161490565b9073ffffffffffffffffffffffffffffffffffffffff6154fa612b50565b9216600052600060205263ffffffff600160406000206dffffffffffffffffffffffffffff815460781c1685520154166020830152565b61044d3361562b565b73ffffffffffffffffffffffffffffffffffffffff16600052600060205260406000206dffffffffffffffffffffffffffff8082541692830180931161561e575b8083116155c05761044d92166dffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffff0000000000000000000000000000825416179055565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f6465706f736974206f766572666c6f77000000000000000000000000000000006044820152fd5b615626612190565b61557b565b73ffffffffffffffffffffffffffffffffffffffff9061564b348261553a565b168060005260006020527f2da466a7b24304f47e87fa2e1e5a81b9831ce54fec19055ce277ca2f39ba42c460206dffffffffffffffffffffffffffff60406000205416604051908152a2565b1561569e57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f6d757374207370656369667920756e7374616b652064656c61790000000000006044820152fd5b1561570357565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f63616e6e6f7420646563726561736520756e7374616b652074696d65000000006044820152fd5b1561576857565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f6e6f207374616b652073706563696669656400000000000000000000000000006044820152fd5b156157cd57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f7374616b65206f766572666c6f770000000000000000000000000000000000006044820152fd5b9065ffffffffffff6080600161044d9461588b6dffffffffffffffffffffffffffff86511682906dffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffff0000000000000000000000000000825416179055565b602085015115156eff000000000000000000000000000082549160701b16807fffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffff83161783557fffffff000000000000000000000000000000ffffffffffffffffffffffffffff7cffffffffffffffffffffffffffff000000000000000000000000000000604089015160781b16921617178155019263ffffffff6060820151167fffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000008554161784550151167fffffffffffffffffffffffffffffffffffffffffffff000000000000ffffffff69ffffffffffff0000000083549260201b169116179055565b1561599657565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f616c726561647920756e7374616b696e670000000000000000000000000000006044820152fd5b91909165ffffffffffff808094169116019182116121cd57565b15615a1557565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f4e6f207374616b6520746f2077697468647261770000000000000000000000006044820152fd5b15615a7a57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f6d7573742063616c6c20756e6c6f636b5374616b6528292066697273740000006044820152fd5b15615adf57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f5374616b65207769746864726177616c206973206e6f742064756500000000006044820152fd5b15615b4457565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f6661696c656420746f207769746864726177207374616b6500000000000000006044820152fd5b15615ba957565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f6661696c656420746f20776974686472617700000000000000000000000000006044820152fd5b816040519182372090565b9060009283809360208451940192f190565b3d610800808211615c4b575b50604051906020818301016040528082526000602083013e90565b905038615c3056fea2646970667358221220a706d8b02d7086d80e9330811f5af84b2614abdc5e9a1f2260126070a31d7cee64736f6c63430008110033", - "linkReferences": {}, - "deployedLinkReferences": {} -} diff --git a/packages/common/abis/misc/AddressResolver.json b/packages/common/abis/misc/AddressResolver.json deleted file mode 100644 index 899d2623f..000000000 --- a/packages/common/abis/misc/AddressResolver.json +++ /dev/null @@ -1,249 +0,0 @@ -{ - "_format": "hh-sol-artifact-1", - "contractName": "AddressResolver", - "sourceName": "contracts/smart-account/utils/AddressResolver.sol", - "abi": [ - { - "inputs": [ - { - "internalType": "address", - "name": "_v1Factory", - "type": "address" - }, - { - "internalType": "address", - "name": "_v2Factory", - "type": "address" - }, - { - "internalType": "address", - "name": "_ecdsaModule", - "type": "address" - } - ], - "stateMutability": "nonpayable", - "type": "constructor" - }, - { - "inputs": [], - "name": "ecdsaOwnershipModule", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_eoa", - "type": "address" - }, - { - "internalType": "uint8", - "name": "_maxIndex", - "type": "uint8" - } - ], - "name": "resolveAddresses", - "outputs": [ - { - "components": [ - { - "internalType": "address", - "name": "accountAddress", - "type": "address" - }, - { - "internalType": "address", - "name": "factoryAddress", - "type": "address" - }, - { - "internalType": "address", - "name": "currentImplementation", - "type": "address" - }, - { - "internalType": "string", - "name": "currentVersion", - "type": "string" - }, - { - "internalType": "string", - "name": "factoryVersion", - "type": "string" - }, - { - "internalType": "uint256", - "name": "deploymentIndex", - "type": "uint256" - } - ], - "internalType": "struct IAddressResolver.SmartAccountResult[]", - "name": "", - "type": "tuple[]" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_eoa", - "type": "address" - }, - { - "internalType": "uint8", - "name": "_maxIndex", - "type": "uint8" - }, - { - "internalType": "address", - "name": "_moduleAddress", - "type": "address" - }, - { - "internalType": "bytes", - "name": "_moduleSetupData", - "type": "bytes" - } - ], - "name": "resolveAddressesFlexibleForV2", - "outputs": [ - { - "components": [ - { - "internalType": "address", - "name": "accountAddress", - "type": "address" - }, - { - "internalType": "address", - "name": "factoryAddress", - "type": "address" - }, - { - "internalType": "address", - "name": "currentImplementation", - "type": "address" - }, - { - "internalType": "string", - "name": "currentVersion", - "type": "string" - }, - { - "internalType": "string", - "name": "factoryVersion", - "type": "string" - }, - { - "internalType": "uint256", - "name": "deploymentIndex", - "type": "uint256" - } - ], - "internalType": "struct IAddressResolver.SmartAccountResult[]", - "name": "", - "type": "tuple[]" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_eoa", - "type": "address" - }, - { - "internalType": "uint8", - "name": "_maxIndex", - "type": "uint8" - } - ], - "name": "resolveAddressesV1", - "outputs": [ - { - "components": [ - { - "internalType": "address", - "name": "accountAddress", - "type": "address" - }, - { - "internalType": "address", - "name": "factoryAddress", - "type": "address" - }, - { - "internalType": "address", - "name": "currentImplementation", - "type": "address" - }, - { - "internalType": "string", - "name": "currentVersion", - "type": "string" - }, - { - "internalType": "string", - "name": "factoryVersion", - "type": "string" - }, - { - "internalType": "uint256", - "name": "deploymentIndex", - "type": "uint256" - } - ], - "internalType": "struct IAddressResolver.SmartAccountResult[]", - "name": "", - "type": "tuple[]" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "smartAccountFactoryV1", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "smartAccountFactoryV2", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - } - ], - "bytecode": "0x60e0346200011757601f6200124738819003918201601f19168301916001600160401b038311848410176200011c5780849260609460405283398101031262000117576200004d8162000132565b906200006a6040620000626020840162000132565b920162000132565b916200009f6001600160a01b0362000086818416151562000147565b62000095818516151562000147565b8416151562000147565b60805260a05260c0526040516110b2908162000195823960805181818160e601528181610311015281816104700152818161071b015281816108f60152610c2b015260a0518181816104e8015281816105c40152818161080c015281816109cd0152610aaa015260c051818181607e01526109980152f35b600080fd5b634e487b7160e01b600052604160045260246000fd5b51906001600160a01b03821682036200011757565b156200014f57565b60405162461bcd60e51b815260206004820152601960248201527f5265717569726564206e6f6e2d7a65726f2061646472657373000000000000006044820152606490fdfe6080604052600436101561001257600080fd5b60003560e01c806326bbd86c146108305780632819f31c146107ec578063315f3c03146103355780635acdcdc6146102f15780638d440ec2146100a75763c866cae31461005e57600080fd5b346100a25760003660031901126100a25760206040516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168152f35b600080fd5b346100a25760403660031901126100a2576100c0610cfc565b60ff6100ca610d12565b166100d481610ec6565b9160009160006001600160a01b0392837f000000000000000000000000000000000000000000000000000000000000000016915b83811061016157868661011a81610ec6565b9160005b82811061013757604051806101338682610d6a565b0390f35b8061014460019284610fde565b5161014f8287610fde565b5261015a8186610fde565b500161011e565b604051631acd17f560e31b81526001600160a01b038316600482015260248101829052602081604481875afa90811561028b576000916102d2575b508581161515806102c8575b6101b6575b50600101610108565b90956040519063557887a160e11b82526020826004818a87165afa91821561028b57600092610297575b506040516001621794a360e21b03198152926000846004818b85165afa801561028b5788600195948695600093610266575b50816040519461022186610e22565b168452886020850152166040830152606082015261023d610fc0565b60808201528860a0820152610252828b610fde565b5261025d818a610fde565b500195906101ad565b6102849193503d806000833e61027c8183610e70565b810190610f5e565b918d610212565b6040513d6000823e3d90fd5b6102ba91925060203d6020116102c1575b6102b28183610e70565b810190610f3f565b90896101e0565b503d6102a8565b50803b15156101a8565b6102eb915060203d6020116102c1576102b28183610e70565b8861019c565b346100a25760003660031901126100a25760206040516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168152f35b346100a25760803660031901126100a25761034e610cfc565b610356610d12565b906001600160a01b0360443516604435036100a2576064359167ffffffffffffffff83116100a257366023840112156100a257826004013561039781610e92565b936103a56040519586610e70565b81855236602483830101116100a2578160009260246020930183880137850101526103da60ff6103d483611008565b16610ec6565b9260009260005b60ff841681106104395785856103f681610ec6565b9160005b82811061040f57604051806101338682610d6a565b8061041c60019284610fde565b516104278287610fde565b526104328186610fde565b50016103fa565b604051631acd17f560e31b81526001600160a01b038316600482015260248101829052602081806044810103816001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000165afa90811561028b576000916107cd575b506001600160a01b0381161515806107c3575b610696575b50604051632e7a1a8360e01b8152602081806104dc858860443560048501611033565b03816001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000165afa90811561028b57600091610677575b506001600160a01b03811615158061066d575b61053a575b506001016103e1565b90946040519063557887a160e11b82526020826004816001600160a01b0387165afa91821561028b5760009261064c575b506040516001621794a360e21b03198152906000826004816001600160a01b0388165afa93841561028b5760ff946001948594600092610626575b506001600160a01b039081604051946105be86610e22565b168452817f000000000000000000000000000000000000000000000000000000000000000016602085015216604083015260608201526105fc61105e565b60808201528860a0820152610611828b610fde565b5261061c818a610fde565b5001959150610531565b6001600160a01b03919250610645903d806000833e61027c8183610e70565b91906105a6565b61066691925060203d6020116102c1576102b28183610e70565b908861056b565b50803b151561052c565b610690915060203d6020116102c1576102b28183610e70565b87610519565b60405163557887a160e11b81529195906020836004816001600160a01b0385165afa92831561028b576000936107a2575b506040516001621794a360e21b03198152926000846004816001600160a01b0386165afa90811561028b5760019460009261077c575b506001600160a01b0390816040519461071586610e22565b168452817f00000000000000000000000000000000000000000000000000000000000000001660208501521660408301526060820152610753610fc0565b60808201528660a08201526107688289610fde565b526107738188610fde565b500193866104b9565b6001600160a01b0391925061079b903d806000833e61027c8183610e70565b91906106fd565b6107bc91935060203d6020116102c1576102b28183610e70565b91886106c7565b50803b15156104b4565b6107e6915060203d6020116102c1576102b28183610e70565b876104a1565b346100a25760003660031901126100a25760206040516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168152f35b346100a25760403660031901126100a257610849610cfc565b610851610d12565b61085f60ff6103d483611008565b9160009160005b60ff821681106108bf5750505061087c81610ec6565b9160005b82811061089557604051806101338682610d6a565b806108a260019284610fde565b516108ad8287610fde565b526108b88186610fde565b5001610880565b604051631acd17f560e31b81526001600160a01b038416600482015260248101829052602081806044810103816001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000165afa90811561028b57600091610cdd575b506001600160a01b038116151580610cd3575b610ba6575b5060405162bb78ef60e61b602082015260246001600160a01b03851681830152808252606082019082821067ffffffffffffffff831117610b9257506040819052632e7a1a8360e01b8152602081605f19846109c087827f000000000000000000000000000000000000000000000000000000000000000060648201611033565b0301816001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000165afa91821561028b57600092610b5d575b50506001600160a01b038116151580610b53575b610a20575b50600101610866565b90936040519063557887a160e11b82526020826004816001600160a01b0387165afa91821561028b57600092610b32575b506040516001621794a360e21b03198152906000826004816001600160a01b0388165afa93841561028b5760ff946001948594600092610b0c575b506001600160a01b03908160405194610aa486610e22565b168452817f00000000000000000000000000000000000000000000000000000000000000001660208501521660408301526060820152610ae261105e565b60808201528760a0820152610af7828a610fde565b52610b028189610fde565b5001949150610a17565b6001600160a01b03919250610b2b903d806000833e61027c8183610e70565b9190610a8c565b610b4c91925060203d6020116102c1576102b28183610e70565b9087610a51565b50803b1515610a12565b610b8392506060906020903d602011610b8a575b610b7b8285610e70565b010190610f3f565b86806109fe565b3d9150610b71565b634e487b7160e01b60009081526041600452fd5b60405163557887a160e11b81529194906020836004816001600160a01b0385165afa92831561028b57600093610cb2575b506040516001621794a360e21b03198152926000846004816001600160a01b0386165afa90811561028b57600194600092610c8c575b506001600160a01b03908160405194610c2586610e22565b168452817f00000000000000000000000000000000000000000000000000000000000000001660208501521660408301526060820152610c63610fc0565b60808201528560a0820152610c788288610fde565b52610c838187610fde565b5001928561093f565b6001600160a01b03919250610cab903d806000833e61027c8183610e70565b9190610c0d565b610ccc91935060203d6020116102c1576102b28183610e70565b9187610bd7565b50803b151561093a565b610cf6915060203d6020116102c1576102b28183610e70565b86610927565b600435906001600160a01b03821682036100a257565b6024359060ff821682036100a257565b60005b838110610d355750506000910152565b8181015183820152602001610d25565b90602091610d5e81518092818552858086019101610d22565b601f01601f1916010190565b602080820190808352835180925260409283810182858560051b8401019601946000925b858410610d9f575050505050505090565b909192939495968580600192603f198582030187528a51906001600160a01b0380835116825280848401511684830152878301511687820152610e07610df46060808501519060c08091860152840190610d45565b6080808501519084830390850152610d45565b9160a080910151910152990194019401929594939190610d8e565b60c0810190811067ffffffffffffffff821117610e3e57604052565b634e487b7160e01b600052604160045260246000fd5b6040810190811067ffffffffffffffff821117610e3e57604052565b90601f8019910116810190811067ffffffffffffffff821117610e3e57604052565b67ffffffffffffffff8111610e3e57601f01601f191660200190565b67ffffffffffffffff8111610e3e5760051b60200190565b90610ed082610eae565b604090610edf82519182610e70565b8381528093610ef0601f1991610eae565b019160005b838110610f025750505050565b6020908251610f1081610e22565b6000815282600081830152600085830152606080808401526080830152600060a0830152828601015201610ef5565b908160209103126100a257516001600160a01b03811681036100a25790565b6020818303126100a25780519067ffffffffffffffff82116100a2570181601f820112156100a2578051610f9181610e92565b92610f9f6040519485610e70565b818452602082840101116100a257610fbd9160208085019101610d22565b90565b60405190610fcd82610e54565b6002825261763160f01b6020830152565b8051821015610ff25760209160051b010190565b634e487b7160e01b600052603260045260246000fd5b60011b906101fe60fe83169216820361101d57565b634e487b7160e01b600052601160045260246000fd5b939291611059906001600160a01b03604093168652606060208701526060860190610d45565b930152565b6040519061106b82610e54565b60028252613b1960f11b602083015256fea264697066735822122083951a990433399478b293d1c860c5b725a11f7db47b61e057d189f59c9adeeb64736f6c63430008110033", - "deployedBytecode": "0x6080604052600436101561001257600080fd5b60003560e01c806326bbd86c146108305780632819f31c146107ec578063315f3c03146103355780635acdcdc6146102f15780638d440ec2146100a75763c866cae31461005e57600080fd5b346100a25760003660031901126100a25760206040516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168152f35b600080fd5b346100a25760403660031901126100a2576100c0610cfc565b60ff6100ca610d12565b166100d481610ec6565b9160009160006001600160a01b0392837f000000000000000000000000000000000000000000000000000000000000000016915b83811061016157868661011a81610ec6565b9160005b82811061013757604051806101338682610d6a565b0390f35b8061014460019284610fde565b5161014f8287610fde565b5261015a8186610fde565b500161011e565b604051631acd17f560e31b81526001600160a01b038316600482015260248101829052602081604481875afa90811561028b576000916102d2575b508581161515806102c8575b6101b6575b50600101610108565b90956040519063557887a160e11b82526020826004818a87165afa91821561028b57600092610297575b506040516001621794a360e21b03198152926000846004818b85165afa801561028b5788600195948695600093610266575b50816040519461022186610e22565b168452886020850152166040830152606082015261023d610fc0565b60808201528860a0820152610252828b610fde565b5261025d818a610fde565b500195906101ad565b6102849193503d806000833e61027c8183610e70565b810190610f5e565b918d610212565b6040513d6000823e3d90fd5b6102ba91925060203d6020116102c1575b6102b28183610e70565b810190610f3f565b90896101e0565b503d6102a8565b50803b15156101a8565b6102eb915060203d6020116102c1576102b28183610e70565b8861019c565b346100a25760003660031901126100a25760206040516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168152f35b346100a25760803660031901126100a25761034e610cfc565b610356610d12565b906001600160a01b0360443516604435036100a2576064359167ffffffffffffffff83116100a257366023840112156100a257826004013561039781610e92565b936103a56040519586610e70565b81855236602483830101116100a2578160009260246020930183880137850101526103da60ff6103d483611008565b16610ec6565b9260009260005b60ff841681106104395785856103f681610ec6565b9160005b82811061040f57604051806101338682610d6a565b8061041c60019284610fde565b516104278287610fde565b526104328186610fde565b50016103fa565b604051631acd17f560e31b81526001600160a01b038316600482015260248101829052602081806044810103816001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000165afa90811561028b576000916107cd575b506001600160a01b0381161515806107c3575b610696575b50604051632e7a1a8360e01b8152602081806104dc858860443560048501611033565b03816001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000165afa90811561028b57600091610677575b506001600160a01b03811615158061066d575b61053a575b506001016103e1565b90946040519063557887a160e11b82526020826004816001600160a01b0387165afa91821561028b5760009261064c575b506040516001621794a360e21b03198152906000826004816001600160a01b0388165afa93841561028b5760ff946001948594600092610626575b506001600160a01b039081604051946105be86610e22565b168452817f000000000000000000000000000000000000000000000000000000000000000016602085015216604083015260608201526105fc61105e565b60808201528860a0820152610611828b610fde565b5261061c818a610fde565b5001959150610531565b6001600160a01b03919250610645903d806000833e61027c8183610e70565b91906105a6565b61066691925060203d6020116102c1576102b28183610e70565b908861056b565b50803b151561052c565b610690915060203d6020116102c1576102b28183610e70565b87610519565b60405163557887a160e11b81529195906020836004816001600160a01b0385165afa92831561028b576000936107a2575b506040516001621794a360e21b03198152926000846004816001600160a01b0386165afa90811561028b5760019460009261077c575b506001600160a01b0390816040519461071586610e22565b168452817f00000000000000000000000000000000000000000000000000000000000000001660208501521660408301526060820152610753610fc0565b60808201528660a08201526107688289610fde565b526107738188610fde565b500193866104b9565b6001600160a01b0391925061079b903d806000833e61027c8183610e70565b91906106fd565b6107bc91935060203d6020116102c1576102b28183610e70565b91886106c7565b50803b15156104b4565b6107e6915060203d6020116102c1576102b28183610e70565b876104a1565b346100a25760003660031901126100a25760206040516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168152f35b346100a25760403660031901126100a257610849610cfc565b610851610d12565b61085f60ff6103d483611008565b9160009160005b60ff821681106108bf5750505061087c81610ec6565b9160005b82811061089557604051806101338682610d6a565b806108a260019284610fde565b516108ad8287610fde565b526108b88186610fde565b5001610880565b604051631acd17f560e31b81526001600160a01b038416600482015260248101829052602081806044810103816001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000165afa90811561028b57600091610cdd575b506001600160a01b038116151580610cd3575b610ba6575b5060405162bb78ef60e61b602082015260246001600160a01b03851681830152808252606082019082821067ffffffffffffffff831117610b9257506040819052632e7a1a8360e01b8152602081605f19846109c087827f000000000000000000000000000000000000000000000000000000000000000060648201611033565b0301816001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000165afa91821561028b57600092610b5d575b50506001600160a01b038116151580610b53575b610a20575b50600101610866565b90936040519063557887a160e11b82526020826004816001600160a01b0387165afa91821561028b57600092610b32575b506040516001621794a360e21b03198152906000826004816001600160a01b0388165afa93841561028b5760ff946001948594600092610b0c575b506001600160a01b03908160405194610aa486610e22565b168452817f00000000000000000000000000000000000000000000000000000000000000001660208501521660408301526060820152610ae261105e565b60808201528760a0820152610af7828a610fde565b52610b028189610fde565b5001949150610a17565b6001600160a01b03919250610b2b903d806000833e61027c8183610e70565b9190610a8c565b610b4c91925060203d6020116102c1576102b28183610e70565b9087610a51565b50803b1515610a12565b610b8392506060906020903d602011610b8a575b610b7b8285610e70565b010190610f3f565b86806109fe565b3d9150610b71565b634e487b7160e01b60009081526041600452fd5b60405163557887a160e11b81529194906020836004816001600160a01b0385165afa92831561028b57600093610cb2575b506040516001621794a360e21b03198152926000846004816001600160a01b0386165afa90811561028b57600194600092610c8c575b506001600160a01b03908160405194610c2586610e22565b168452817f00000000000000000000000000000000000000000000000000000000000000001660208501521660408301526060820152610c63610fc0565b60808201528560a0820152610c788288610fde565b52610c838187610fde565b5001928561093f565b6001600160a01b03919250610cab903d806000833e61027c8183610e70565b9190610c0d565b610ccc91935060203d6020116102c1576102b28183610e70565b9187610bd7565b50803b151561093a565b610cf6915060203d6020116102c1576102b28183610e70565b86610927565b600435906001600160a01b03821682036100a257565b6024359060ff821682036100a257565b60005b838110610d355750506000910152565b8181015183820152602001610d25565b90602091610d5e81518092818552858086019101610d22565b601f01601f1916010190565b602080820190808352835180925260409283810182858560051b8401019601946000925b858410610d9f575050505050505090565b909192939495968580600192603f198582030187528a51906001600160a01b0380835116825280848401511684830152878301511687820152610e07610df46060808501519060c08091860152840190610d45565b6080808501519084830390850152610d45565b9160a080910151910152990194019401929594939190610d8e565b60c0810190811067ffffffffffffffff821117610e3e57604052565b634e487b7160e01b600052604160045260246000fd5b6040810190811067ffffffffffffffff821117610e3e57604052565b90601f8019910116810190811067ffffffffffffffff821117610e3e57604052565b67ffffffffffffffff8111610e3e57601f01601f191660200190565b67ffffffffffffffff8111610e3e5760051b60200190565b90610ed082610eae565b604090610edf82519182610e70565b8381528093610ef0601f1991610eae565b019160005b838110610f025750505050565b6020908251610f1081610e22565b6000815282600081830152600085830152606080808401526080830152600060a0830152828601015201610ef5565b908160209103126100a257516001600160a01b03811681036100a25790565b6020818303126100a25780519067ffffffffffffffff82116100a2570181601f820112156100a2578051610f9181610e92565b92610f9f6040519485610e70565b818452602082840101116100a257610fbd9160208085019101610d22565b90565b60405190610fcd82610e54565b6002825261763160f01b6020830152565b8051821015610ff25760209160051b010190565b634e487b7160e01b600052603260045260246000fd5b60011b906101fe60fe83169216820361101d57565b634e487b7160e01b600052601160045260246000fd5b939291611059906001600160a01b03604093168652606060208701526060860190610d45565b930152565b6040519061106b82610e54565b60028252613b1960f11b602083015256fea264697066735822122083951a990433399478b293d1c860c5b725a11f7db47b61e057d189f59c9adeeb64736f6c63430008110033", - "linkReferences": {}, - "deployedLinkReferences": {} -} diff --git a/packages/common/package.json b/packages/common/package.json index d17dddfc6..e69b3dcba 100644 --- a/packages/common/package.json +++ b/packages/common/package.json @@ -1,6 +1,6 @@ { "name": "@biconomy/common", - "version": "3.1.3", + "version": "4.0.0", "description": "common utils to be used for aa transactions", "keywords": [ "utils" @@ -8,7 +8,18 @@ "author": "livingrockrises ", "homepage": "https://github.com/bcnmy/biconomy-client-sdk#readme", "license": "MIT", - "main": "dist/src/index.js", + "main": "./dist/cjs/index.js", + "module": "./dist/esm/index.js", + "types": "./dist/types/index.d.ts", + "typings": "./dist/types/index.d.ts", + "exports": { + ".": { + "import": "./dist/esm/index.js", + "types": "./dist/types/index.d.ts", + "default": "./dist/cjs/index.js" + }, + "./package.json": "./package.json" + }, "files": [ "dist/*", "README.md" @@ -21,18 +32,21 @@ "url": "git+https://github.com/bcnmy/biconomy-client-sdk.git" }, "scripts": { - "clear": "rm -rf dist artifacts cache src/typechain", - "hardhat-deploy": "hardhat deploy", - "hardhat-node": "hardhat node", - "lint-fix": "eslint -f unix . --fix", - "watch-tsc": "tsc -w --preserveWatchOutput", - "gen:types": "typechain --target=ethers-v5 --out-dir=src/typechain 'abis/*/*.json'", - "tsc": "tsc", - "test": "jest tests/**/*.spec.ts --runInBand", + "unbuild": "rimraf dist *.tsbuildinfo", + "build:watch": "yarn build:tsc --watch", + "dist:minify": "esbuild ./dist/esm/**/*.js ./dist/esm/*.js --minify --outdir=./dist/esm --bundle=false --allow-overwrite", + "build": "yarn unbuild && yarn build:tsc", + "build:esbuild": "yarn build:esbuild:cjs && yarn build:esbuild:esm && yarn build:typ", + "build:tsc:cjs": "tsc --project tsconfig.build.json --module commonjs --outDir ./dist/cjs --removeComments --verbatimModuleSyntax false && echo > ./dist/cjs/package.json '{\"type\":\"commonjs\"}'", + "build:tsc:esm": "tsc --project tsconfig.build.json --module esnext --outDir ./dist/esm --removeComments && echo > ./dist/esm/package.json '{\"type\":\"module\"}'", + "build:esbuild:cjs": "node .esbuild.js CJS && echo > ./dist/cjs/package.json '{\"type\":\"commonjs\"}'", + "build:esbuild:esm": "node .esbuild.js ESM && echo > ./dist/esm/package.json '{\"type\":\"module\"}'", + "build:typ": "tsc --project tsconfig.build.json --module esnext --declarationDir ./dist/types --emitDeclarationOnly --declaration --declarationMap", + "build:tsc": "yarn build:tsc:cjs && yarn build:tsc:esm && yarn build:typ && yarn dist:minify", "test:file": "jest --config=../../jest.config.js --runInBand", + "test:concurrently": "concurrently -k --success first 'yarn start:ganache > /dev/null'", "test:run": "jest tests/**/*.spec.ts --runInBand", - "unbuild": "rimraf dist *.tsbuildinfo", - "build": "rimraf dist && npm run gen:types && tsc", + "start:ganache": "ganache -m 'direct buyer cliff train rice spirit census refuse glare expire innocent quote'", "format": "prettier --write \"{src,tests}/**/*.ts\"", "lint": "tslint -p tsconfig.json" }, @@ -40,23 +54,14 @@ "url": "https://github.com/bcnmy/biconomy-client-sdk/issues" }, "dependencies": { - "@account-abstraction/contracts": "^0.6.0", - "@biconomy/core-types": "^3.1.3", - "@biconomy/node-client": "^3.1.3", - "@ethersproject/abi": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/providers": "^5.7.0", - "@openzeppelin/contracts": "^4.7.3", - "@typechain/ethers-v5": "^10.2.0", - "concurrently": "^7.4.0", - "debug": "^4.3.4", - "ethers": "^5.7.0", - "node-fetch": "^2.7.0", - "typechain": "^8.1.1" + "@alchemy/aa-core": "3.0.0-alpha.4", + "@ethersproject/abstract-signer": "^5.7.0", + "viem": "^2.7.3" }, "devDependencies": { - "@nomicfoundation/hardhat-toolbox": "^1.0.2", - "@nomiclabs/hardhat-ethers": "^2.0.0", - "hardhat": "^2.11.0" + "@types/node": "^20.11.10", + "esbuild": "^0.19.11", + "esbuild-plugin-tsc": "^0.4.0", + "npm-dts": "^1.3.12" } } diff --git a/packages/common/src/Constants.ts b/packages/common/src/Constants.ts deleted file mode 100644 index 7770b372c..000000000 --- a/packages/common/src/Constants.ts +++ /dev/null @@ -1,42 +0,0 @@ -import { ChainId } from "@biconomy/core-types"; - -export const NODE_CLIENT_URL = "https://sdk-backend.prod.biconomy.io/v1"; - -// eslint-disable-next-line no-unused-vars -export const RPC_PROVIDER_URLS: { [key in ChainId]?: string } = { - [ChainId.MAINNET]: "https://rpc.ankr.com/eth", - [ChainId.GOERLI]: "https://rpc.ankr.com/eth_goerli", - [ChainId.SEPOLIA]: "https://rpc.ankr.com/eth_sepolia", - [ChainId.POLYGON_MUMBAI]: "https://rpc.ankr.com/polygon_mumbai", - [ChainId.POLYGON_MAINNET]: "https://rpc.ankr.com/polygon", - [ChainId.BSC_TESTNET]: "https://endpoints.omniatech.io/v1/bsc/testnet/public", - [ChainId.BSC_MAINNET]: "https://rpc.ankr.com/bsc", - [ChainId.POLYGON_ZKEVM_TESTNET]: "https://rpc.public.zkevm-test.net", - [ChainId.POLYGON_ZKEVM_MAINNET]: "https://rpc.ankr.com/polygon_zkevm", - [ChainId.ARBITRUM_GOERLI_TESTNET]: "https://goerli-rollup.arbitrum.io/rpc", - [ChainId.ARBITRUM_SEPOLIA]: "https://arbitrum-sepolia.blockpi.network/v1/rpc/public", - [ChainId.ARBITRUM_ONE_MAINNET]: "https://rpc.ankr.com/arbitrum", - [ChainId.ARBITRUM_NOVA_MAINNET]: "https://nova.arbitrum.io/rpc", - [ChainId.OPTIMISM_MAINNET]: "https://mainnet.optimism.io", - [ChainId.OPTIMISM_GOERLI_TESTNET]: "https://goerli.optimism.io", - [ChainId.AVALANCHE_MAINNET]: "https://api.avax.network/ext/bc/C/rpc", - [ChainId.AVALANCHE_TESTNET]: "https://api.avax-test.network/ext/bc/C/rpc", - [ChainId.MOONBEAM_MAINNET]: "https://rpc.api.moonbeam.network", - [ChainId.BASE_GOERLI_TESTNET]: "https://goerli.base.org", - [ChainId.BASE_MAINNET]: "https://developer-access-mainnet.base.org", - [ChainId.LINEA_TESTNET]: "https://rpc.goerli.linea.build", - [ChainId.LINEA_MAINNET]: "https://rpc.linea.build", - [ChainId.MANTLE_MAINNET]: "https://rpc.mantle.xyz", - [ChainId.MANTLE_TESTNET]: "https://rpc.testnet.mantle.xyz", - [ChainId.OPBNB_MAINNET]: "https://opbnb-mainnet-rpc.bnbchain.org", - [ChainId.OPBNB_TESTNET]: "https://opbnb-testnet-rpc.bnbchain.org", - [ChainId.ASTAR_MAINNET]: "https://evm.astar.network", - [ChainId.ASTAR_TESTNET]: "https://evm.shibuya.astar.network", - [ChainId.CHILIZ_MAINNET]: "https://rpc.ankr.com/chiliz", - [ChainId.CHILIZ_TESTNET]: "https://spicy-rpc.chiliz.com", - [ChainId.CORE_MAINNET]: "https://rpc.core.chain.com", - [ChainId.CORE_TESTNET]: "https://rpc.testnet.core.chain.com", - [ChainId.MANTA_PACIFIC_MAINNET]: "https://pacific-rpc.manta.network/http", - [ChainId.MANTA_PACIFIC_TESTNET]: "https://pacific-rpc.testnet.manta.network/http", - [ChainId.CAPX_TESTNET]: "https://capx-zk-rpc.lgns.me/sequencer-api", -}; diff --git a/packages/common/src/ContractsInstances.ts b/packages/common/src/ContractsInstances.ts deleted file mode 100644 index e50294353..000000000 --- a/packages/common/src/ContractsInstances.ts +++ /dev/null @@ -1,82 +0,0 @@ -import { SmartAccountType } from "@biconomy/core-types"; -import { JsonRpcProvider } from "@ethersproject/providers"; -import { IEntryPoint } from "@account-abstraction/contracts"; -import { - EntryPoint_v005__factory, - EntryPoint_v006__factory, - SmartAccount_v100, - SmartAccount_v200, - SmartAccountFactory_v100, - SmartAccountFactory_v200, - SmartAccountFactory_v100__factory, - SmartAccountFactory_v200__factory, - SmartAccount_v100__factory, - SmartAccount_v200__factory, -} from "./typechain"; - -export type GetContractInstanceDto = { - smartAccountType: SmartAccountType; - version: string; - contractAddress: string; - provider: JsonRpcProvider; -}; - -// Note: Review return types while adding new implementations -export function getSAProxyContract(contractInstanceDto: GetContractInstanceDto): SmartAccount_v100 | SmartAccount_v200 { - const { smartAccountType, version, contractAddress, provider } = contractInstanceDto; - switch (version) { - case "V1_0_0": - if (smartAccountType === SmartAccountType.BICONOMY) { - return SmartAccount_v100__factory.connect(contractAddress, provider); - } - break; - case "V2_0_0": - if (smartAccountType === SmartAccountType.BICONOMY) { - return SmartAccount_v200__factory.connect(contractAddress, provider); - } - break; - default: - return SmartAccount_v200__factory.connect(contractAddress, provider); - } - throw new Error("Invalid version or smartAccountType provided for proxy contract instance"); -} - -export function getSAFactoryContract(contractInstanceDto: GetContractInstanceDto): SmartAccountFactory_v100 | SmartAccountFactory_v200 { - const { smartAccountType, version, contractAddress, provider } = contractInstanceDto; - - switch (version) { - case "V1_0_0": - if (smartAccountType === SmartAccountType.BICONOMY) { - return SmartAccountFactory_v100__factory.connect(contractAddress, provider); - } - break; - case "V2_0_0": - if (smartAccountType === SmartAccountType.BICONOMY) { - return SmartAccountFactory_v200__factory.connect(contractAddress, provider); - } - break; - default: - return SmartAccountFactory_v200__factory.connect(contractAddress, provider); - } - throw new Error("Invalid version or smartAccountType provided for factory contract instance"); -} - -export function getEntryPointContract(contractInstanceDto: GetContractInstanceDto): IEntryPoint { - const { smartAccountType, version, contractAddress, provider } = contractInstanceDto; - - switch (version) { - case "V0_0_5": - if (smartAccountType === SmartAccountType.BICONOMY) { - return EntryPoint_v005__factory.connect(contractAddress, provider); - } - break; - case "V0_0_6": - if (smartAccountType === SmartAccountType.BICONOMY) { - return EntryPoint_v006__factory.connect(contractAddress, provider); - } - break; - default: - return EntryPoint_v006__factory.connect(contractAddress, provider); - } - throw new Error("Invalid version or smartAccountType provided for entrypoint contract instance"); -} diff --git a/packages/common/src/ERC4337Utils.ts b/packages/common/src/ERC4337Utils.ts deleted file mode 100644 index 435e82746..000000000 --- a/packages/common/src/ERC4337Utils.ts +++ /dev/null @@ -1,178 +0,0 @@ -import { defaultAbiCoder, hexConcat, hexlify, keccak256 } from "ethers/lib/utils"; -import { ethers } from "ethers"; -import Debug from "debug"; -import { ChainId, UserOperation } from "@biconomy/core-types"; - -const debug = Debug("aa.utils"); - -export const AddressZero = ethers.constants.AddressZero; - -export const EIP1559_UNSUPPORTED_NETWORKS: Array = [97, 56, 1442, 1101]; - -// reverse "Deferrable" or "PromiseOrValue" fields -/* eslint-disable @typescript-eslint/no-explicit-any */ -export type NotPromise = { - [P in keyof T]: Exclude>; -}; - -// function encode(typevalues: Array<{ type: string; val: any }>, forSignature: boolean): string { -// const types = typevalues.map((typevalue) => -// typevalue.type === 'bytes' && forSignature ? 'bytes32' : typevalue.type -// ) -// const values = typevalues.map((typevalue) => -// typevalue.type === 'bytes' && forSignature ? keccak256(typevalue.val) : typevalue.val -// ) -// return defaultAbiCoder.encode(types, values) -// } - -/** - * pack the userOperation - * @param op - * @param forSignature "true" if the hash is needed to calculate the getUserOpHash() - * "false" to pack entire UserOp, for calculating the calldata cost of putting it on-chain. - */ -export function packUserOp(op: Partial, forSignature = true): string { - if (!op.initCode || !op.callData || !op.paymasterAndData) throw new Error("Missing userOp properties"); - - if (forSignature) { - return defaultAbiCoder.encode( - ["address", "uint256", "bytes32", "bytes32", "uint256", "uint256", "uint256", "uint256", "uint256", "bytes32"], - [ - op.sender, - op.nonce, - keccak256(op.initCode), - keccak256(op.callData), - op.callGasLimit, - op.verificationGasLimit, - op.preVerificationGas, - op.maxFeePerGas, - op.maxPriorityFeePerGas, - keccak256(op.paymasterAndData), - ], - ); - } else { - // for the purpose of calculating gas cost encode also signature (and no keccak of bytes) - return defaultAbiCoder.encode( - ["address", "uint256", "bytes", "bytes", "uint256", "uint256", "uint256", "uint256", "uint256", "bytes", "bytes"], - [ - op.sender, - op.nonce, - op.initCode, - op.callData, - op.callGasLimit, - op.verificationGasLimit, - op.preVerificationGas, - op.maxFeePerGas, - op.maxPriorityFeePerGas, - op.paymasterAndData, - op.signature, - ], - ); - } -} - -/** - * calculate the userOpHash of a given userOperation. - * The userOpHash is a hash of all UserOperation fields, except the "signature" field. - * The entryPoint uses this value in the emitted UserOperationEvent. - * A wallet may use this value as the hash to sign (the SampleWallet uses this method) - * @param op - * @param entryPoint - * @param chainId - */ -export function getUserOpHash(op: Partial, entryPoint: string, chainId: number): string { - const userOpHash = keccak256(packUserOp(op, true)); - const enc = defaultAbiCoder.encode(["bytes32", "address", "uint256"], [userOpHash, entryPoint, chainId]); - return keccak256(enc); -} - -const ErrorSig = keccak256(Buffer.from("Error(string)")).slice(0, 10); // 0x08c379a0 -const FailedOpSig = keccak256(Buffer.from("FailedOp(uint256,address,string)")).slice(0, 10); // 0x00fa072b - -interface DecodedError { - message: string; - opIndex?: number; - paymaster?: string; -} - -/** - * decode bytes thrown by revert as Error(message) or FailedOp(opIndex,paymaster,message) - */ -export function decodeErrorReason(error: string): DecodedError | undefined { - debug("decoding", error); - if (error.startsWith(ErrorSig)) { - const [message] = defaultAbiCoder.decode(["string"], "0x" + error.substring(10)); - return { message }; - } else if (error.startsWith(FailedOpSig)) { - const resultSet = defaultAbiCoder.decode(["uint256", "address", "string"], "0x" + error.substring(10)); - let [paymaster, message] = resultSet; - const [opIndex] = resultSet; - message = `FailedOp: ${message as string}`; - if (paymaster.toString() !== ethers.constants.AddressZero) { - message = `${message as string} (paymaster ${paymaster as string})`; - } else { - paymaster = undefined; - } - return { - message, - opIndex, - paymaster, - }; - } - return undefined; -} - -/** - * update thrown Error object with our custom FailedOp message, and re-throw it. - * updated both "message" and inner encoded "data" - * tested on geth, hardhat-node - * usage: entryPoint.handleOps().catch(decodeError) - */ -export function rethrowError(e: any): any { - let error = e; - let parent = e; - if (error?.error != null) { - error = error.error; - } - while (error?.data != null) { - parent = error; - error = error.data; - } - const decoded = typeof error === "string" && error.length > 2 ? decodeErrorReason(error) : undefined; - if (decoded != null) { - e.message = decoded.message; - - if (decoded.opIndex != null) { - // helper for chai: convert our FailedOp error into "Error(msg)" - const errorWithMsg = hexConcat([ErrorSig, defaultAbiCoder.encode(["string"], [decoded.message])]); - // modify in-place the error object: - parent.data = errorWithMsg; - } - } - throw e; -} - -/** - * hexlify all members of object, recursively - * @param obj - */ -export function deepHexlify(obj: any): any { - if (typeof obj === "function") { - return undefined; - } - if (obj == null || typeof obj === "string" || typeof obj === "boolean") { - return obj; - } else if (obj._isBigNumber != null || typeof obj !== "object") { - return hexlify(obj).replace(/^0x0/, "0x"); - } - if (Array.isArray(obj)) { - return obj.map((member) => deepHexlify(member)); - } - return Object.keys(obj).reduce( - (set, key) => ({ - ...set, - [key]: deepHexlify(obj[key]), - }), - {}, - ); -} diff --git a/packages/common/src/Utils.ts b/packages/common/src/Utils.ts deleted file mode 100644 index c97c7bc41..000000000 --- a/packages/common/src/Utils.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { BigNumber, Bytes } from "ethers"; - -/** - * @description this function will return current timestamp in seconds - * @returns Number - */ -export const getTimestampInSeconds = (): number => { - return Math.floor(Date.now() / 1000); -}; - -export const isNullOrUndefined = (value: string | number | bigint | BigNumber | Bytes | undefined): value is undefined => { - return value === null || value === undefined; -}; diff --git a/packages/common/src/httpRequests.ts b/packages/common/src/httpRequests.ts deleted file mode 100644 index d4923d2b6..000000000 --- a/packages/common/src/httpRequests.ts +++ /dev/null @@ -1,86 +0,0 @@ -import fetch from "node-fetch"; -import { Logger } from "./Logger"; - -export enum HttpMethod { - Get = "get", - Post = "post", - Delete = "delete", -} - -/* eslint-disable @typescript-eslint/no-explicit-any */ -interface HttpRequest { - url: string; - method: HttpMethod; - body?: Record; - headers?: object; -} - -interface JsonResponse { - result?: any; - error?: string | { code?: number; message?: string; handleOpsCallData?: any }; - message?: string; - msg?: string; -} - -export async function sendRequest({ url, method, body, headers = {} }: HttpRequest): Promise { - Logger.log("jsonRpc request body ", JSON.stringify(body)); - const response = await fetch(url, { - method, - headers: { - ...headers, - Accept: "application/json", - "Content-Type": "application/json", - }, - body: JSON.stringify(body), - }); - - let jsonResponse: JsonResponse | undefined; - try { - jsonResponse = (await response.json()) as JsonResponse; - } catch (error) { - if (!response.ok) { - throw new Error(response.statusText); - } - } - - if (!jsonResponse) { - // Handle the case where jsonResponse is undefined - throw new Error("No response received."); - } - - Logger.log("jsonRpc response ", jsonResponse); - - if (response.ok) { - if (jsonResponse && Object.prototype.hasOwnProperty.call(jsonResponse, "result")) { - return jsonResponse as T; - } - // else - } - const errorObject = { code: response.status, message: response.statusText, data: undefined }; - - if (jsonResponse?.error) { - if (typeof jsonResponse.error === "string") { - const error = jsonResponse.error; - errorObject.code = response.status; - errorObject.message = error; - delete errorObject.data; - throw errorObject; - } else if (typeof jsonResponse.error === "object") { - const error = jsonResponse.error; - errorObject.code = error?.code || 0; - errorObject.message = error?.message || "Unknown Error"; - errorObject.data = error?.handleOpsCallData; - throw errorObject; - } - } - if (jsonResponse?.message) { - errorObject.message = jsonResponse.message; - throw errorObject; - } - if (jsonResponse?.msg) { - errorObject.message = jsonResponse.msg; - throw errorObject; - } - - throw new Error("Unknown Error: Raise an issue here https://github.com/bcnmy/biconomy-client-sdk/issues with reproduction steps"); -} diff --git a/packages/common/src/index.ts b/packages/common/src/index.ts index a23afa8c6..cca231168 100644 --- a/packages/common/src/index.ts +++ b/packages/common/src/index.ts @@ -1,7 +1,6 @@ -export * from "./ERC4337Utils"; -export * from "./Logger"; -export * from "./httpRequests"; -export * from "./typechain/index"; -export * from "./Utils"; -export * from "./Constants"; -export * from "./ContractsInstances"; +export * from "./utils/Helpers/convertSigner.js"; +export * from "./utils/Types.js"; +export * from "./utils/Constants.js"; +export * from "./utils/Logger.js"; +export * from "./utils/HttpRequests.js"; +export { EthersSigner } from "./utils/EthersSigner.js"; diff --git a/packages/common/src/utils/Constants.ts b/packages/common/src/utils/Constants.ts new file mode 100644 index 000000000..4e3292cb5 --- /dev/null +++ b/packages/common/src/utils/Constants.ts @@ -0,0 +1,7 @@ +import { SupportedSignerName } from "./Types.js"; + +export const UNIQUE_PROPERTIES_PER_SIGNER: Record = { + alchemy: "signerType", + ethers: "provider", + viem: "transport", +}; diff --git a/packages/common/src/utils/EthersSigner.ts b/packages/common/src/utils/EthersSigner.ts new file mode 100644 index 000000000..e0c568803 --- /dev/null +++ b/packages/common/src/utils/EthersSigner.ts @@ -0,0 +1,38 @@ +import { SmartAccountSigner } from "@alchemy/aa-core"; +import { Hex } from "viem"; +import { Signer } from "@ethersproject/abstract-signer"; + +export class EthersSigner implements SmartAccountSigner { + signerType: string = "ethers"; + + inner: T; + + constructor(inner: T, signerType: string) { + this.inner = inner; + this.signerType = signerType; + } + + async getAddress() { + return (await this.inner.getAddress()) as Hex; + } + + async signMessage(message: string | Uint8Array): Promise { + const signature = await this.inner?.signMessage(message); + return this.#correctSignature(signature as Hex); + } + + async signTypedData(_notUsed: any): Promise { + throw new Error("signTypedData is not supported for Ethers Signer"); + } + + #correctSignature = (signature: Hex): Hex => { + const potentiallyIncorrectV = parseInt(signature.slice(-2), 16); + if (![27, 28].includes(potentiallyIncorrectV)) { + const correctV = potentiallyIncorrectV + 27; + signature = signature.slice(0, -2) + correctV.toString(16); + } + return signature; + }; +} + +export default EthersSigner; diff --git a/packages/common/src/utils/Helpers/convertSigner.ts b/packages/common/src/utils/Helpers/convertSigner.ts new file mode 100644 index 000000000..23e9691dd --- /dev/null +++ b/packages/common/src/utils/Helpers/convertSigner.ts @@ -0,0 +1,62 @@ +import { EthersSigner } from "../EthersSigner.js"; +import { SupportedSigner } from "../Types"; +import { WalletClient } from "viem"; +import { WalletClientSigner, SmartAccountSigner } from "@alchemy/aa-core"; +import { UNIQUE_PROPERTIES_PER_SIGNER } from "../Constants.js"; +import { Signer } from "@ethersproject/abstract-signer"; + +interface SmartAccountResult { + signer: SmartAccountSigner; + chainId: number | null; + rpcUrl: string | null; +} + +export const convertSigner = async (signer: SupportedSigner, skipChainIdCalls: boolean = false): Promise => { + let resolvedSmartAccountSigner: SmartAccountSigner; + let rpcUrl: string | null = null; + let chainId: number | null = null; + const isAnAlchemySigner = UNIQUE_PROPERTIES_PER_SIGNER.alchemy in signer; + const isAnEthersSigner = UNIQUE_PROPERTIES_PER_SIGNER.ethers in signer; + const isAViemSigner = UNIQUE_PROPERTIES_PER_SIGNER.viem in signer; + + if (!isAnAlchemySigner) { + if (isAnEthersSigner) { + const ethersSigner = signer as Signer; + if (!skipChainIdCalls) { + // If chainId not provided, get it from walletClient + if (!ethersSigner.provider) { + throw new Error("Cannot consume an ethers Wallet without a provider"); + } + const chainIdFromProvider = await ethersSigner.provider.getNetwork(); + if (!chainIdFromProvider?.chainId) { + throw new Error("Cannot consume an ethers Wallet without a chainId"); + } + chainId = Number(chainIdFromProvider.chainId); + } + // convert ethers Wallet to alchemy's SmartAccountSigner under the hood + resolvedSmartAccountSigner = new EthersSigner(ethersSigner, "ethers"); + // @ts-ignore + rpcUrl = ethersSigner.provider?.connection?.url ?? null; + } else if (isAViemSigner) { + const walletClient = signer as WalletClient; + if (!walletClient.account) { + throw new Error("Cannot consume a viem wallet without an account"); + } + if (!skipChainIdCalls) { + // If chainId not provided, get it from walletClient + if (!walletClient.chain) { + throw new Error("Cannot consume a viem wallet without a chainId"); + } + chainId = walletClient.chain.id; + } + // convert viems walletClient to alchemy's SmartAccountSigner under the hood + resolvedSmartAccountSigner = new WalletClientSigner(walletClient, "viem"); + rpcUrl = walletClient?.transport?.url ?? null; + } else { + throw new Error("Unsupported signer"); + } + } else { + resolvedSmartAccountSigner = signer as SmartAccountSigner; + } + return { signer: resolvedSmartAccountSigner, rpcUrl, chainId }; +}; diff --git a/packages/common/src/utils/Helpers/index.ts b/packages/common/src/utils/Helpers/index.ts new file mode 100644 index 000000000..235336dc3 --- /dev/null +++ b/packages/common/src/utils/Helpers/index.ts @@ -0,0 +1 @@ +export * from "./convertSigner.js"; diff --git a/packages/node-client/src/utils/HttpRequests.ts b/packages/common/src/utils/HttpRequests.ts similarity index 82% rename from packages/node-client/src/utils/HttpRequests.ts rename to packages/common/src/utils/HttpRequests.ts index 49cbb7340..429ff1103 100644 --- a/packages/node-client/src/utils/HttpRequests.ts +++ b/packages/common/src/utils/HttpRequests.ts @@ -1,4 +1,5 @@ -import fetch from "node-fetch"; +import { Logger } from "./Logger.js"; +import { Service } from "./Types.js"; export enum HttpMethod { Get = "get", @@ -7,13 +8,13 @@ export enum HttpMethod { } /* eslint-disable @typescript-eslint/no-explicit-any */ -interface HttpRequest { +export interface HttpRequest { url: string; method: HttpMethod; body?: Record; } -export async function sendRequest({ url, method, body }: HttpRequest): Promise { +export async function sendRequest({ url, method, body }: HttpRequest, service: Service): Promise { const response = await fetch(url, { method, headers: { @@ -26,6 +27,7 @@ export async function sendRequest({ url, method, body }: HttpRequest): Promis let jsonResponse; try { jsonResponse = await response.json(); + Logger.log(`${service} RPC Response`, jsonResponse); } catch (error) { if (!response.ok) { throw new Error(response.statusText); @@ -36,7 +38,7 @@ export async function sendRequest({ url, method, body }: HttpRequest): Promis return jsonResponse as T; } if (jsonResponse.error) { - throw new Error(jsonResponse.error); + throw new Error(`${jsonResponse.error.message} from ${service}`); } if (jsonResponse.message) { throw new Error(jsonResponse.message); diff --git a/packages/common/src/Logger.ts b/packages/common/src/utils/Logger.ts similarity index 100% rename from packages/common/src/Logger.ts rename to packages/common/src/utils/Logger.ts diff --git a/packages/common/src/utils/Types.ts b/packages/common/src/utils/Types.ts new file mode 100644 index 000000000..69508e21f --- /dev/null +++ b/packages/common/src/utils/Types.ts @@ -0,0 +1,13 @@ +import { WalletClient } from "viem"; +import { Signer } from "@ethersproject/abstract-signer"; +import { SmartAccountSigner } from "@alchemy/aa-core"; + +export type SupportedSignerName = "alchemy" | "ethers" | "viem"; +export type SupportedSigner = SmartAccountSigner | WalletClient | Signer | LightSigner; + +export type Service = "Bundler" | "Paymaster"; + +export interface LightSigner { + getAddress(): Promise; + signMessage(message: string | Uint8Array): Promise; +} diff --git a/packages/common/tests/ERC4337Utils.spec.ts b/packages/common/tests/ERC4337Utils.spec.ts deleted file mode 100644 index b7a6af546..000000000 --- a/packages/common/tests/ERC4337Utils.spec.ts +++ /dev/null @@ -1,44 +0,0 @@ -import { expect } from "chai"; -import { packUserOp } from "../src/ERC4337Utils"; - -describe("packUserOp", () => { - it("should pack a UserOperationStruct object", () => { - const userOp = { - sender: "0x1234567890123456789012345678901234567890", - nonce: 1, - initCode: "0x0987654321098765432109876543210987654321", - callData: "0x", - callGasLimit: 1000000, - verificationGasLimit: 1000000, - preVerificationGas: 1000000, - maxFeePerGas: 10, - maxPriorityFeePerGas: 1, - paymasterAndData: "0x0987654321098765432109876543210987654321", - signature: "0x", - }; - const packedUserOp = packUserOp(userOp, false); - expect(packedUserOp).to.equal( - "0x00000000000000000000000012345678901234567890123456789012345678900000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000001a000000000000000000000000000000000000000000000000000000000000f424000000000000000000000000000000000000000000000000000000000000f424000000000000000000000000000000000000000000000000000000000000f4240000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000001c00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000001409876543210987654321098765432109876543210000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001409876543210987654321098765432109876543210000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - ); - }); - - it("should pack a UserOperationStruct object for signature", () => { - const userOp = { - sender: "0x1234567890123456789012345678901234567890", - nonce: 1, - initCode: "0x0987654321098765432109876543210987654321", - callData: "0x", - callGasLimit: 1000000, - verificationGasLimit: 1000000, - preVerificationGas: 1000000, - maxFeePerGas: 10, - maxPriorityFeePerGas: 1, - paymasterAndData: "0x0987654321098765432109876543210987654321", - signature: "0x", - }; - const packedUserOp = packUserOp(userOp, true); - expect(packedUserOp).to.equal( - "0x00000000000000000000000012345678901234567890123456789012345678900000000000000000000000000000000000000000000000000000000000000001a04121637443bf141af4dc01872f24d6933dd1e67581bd12f805a945888da6b0c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47000000000000000000000000000000000000000000000000000000000000f424000000000000000000000000000000000000000000000000000000000000f424000000000000000000000000000000000000000000000000000000000000f4240000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000001a04121637443bf141af4dc01872f24d6933dd1e67581bd12f805a945888da6b0", - ); - }); -}); diff --git a/packages/common/tsconfig.build.json b/packages/common/tsconfig.build.json new file mode 100644 index 000000000..4ac8b8026 --- /dev/null +++ b/packages/common/tsconfig.build.json @@ -0,0 +1,32 @@ +{ + "$schema": "https://json.schemastore.org/tsconfig", + "display": "Build", + "compilerOptions": { + "lib": ["es2022", "dom"], + "target": "es2021", + "types": ["node"], + "allowJs": false, + "skipLibCheck": true, + "esModuleInterop": true, + "allowSyntheticDefaultImports": true, + "strict": true, + "forceConsistentCasingInFileNames": true, + "module": "esnext", + "moduleResolution": "node", + "resolveJsonModule": true, + "isolatedModules": true, + "verbatimModuleSyntax": false, + "useDefineForClassFields": true, + "noFallthroughCasesInSwitch": true, + "noImplicitReturns": true, + "useUnknownInCatchVariables": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "declaration": true, + "inlineSources": true, + "noEmit": false, + "sourceMap": true + }, + "exclude": ["**/*/node_modules", "**/*/tests", "tests"], + "include": ["src"] +} \ No newline at end of file diff --git a/packages/common/tsconfig.json b/packages/common/tsconfig.json index 7584e7676..d9b305a9a 100644 --- a/packages/common/tsconfig.json +++ b/packages/common/tsconfig.json @@ -3,7 +3,11 @@ "compilerOptions": { "composite": true, "outDir": "dist", - "baseUrl": "src" + "baseUrl": "src", + "resolveJsonModule": true, + "esModuleInterop": true, + "lib": ["es2020"], + "types": ["node"] }, - "include": ["./**/*.ts"] + "include": ["src", "src/**/*.json"] } diff --git a/packages/core-types/CHANGELOG.md b/packages/core-types/CHANGELOG.md deleted file mode 100644 index 0301480be..000000000 --- a/packages/core-types/CHANGELOG.md +++ /dev/null @@ -1,102 +0,0 @@ -# Change Log - -All notable changes to this project will be documented in this file. -See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. - -## 3.1.3 (2023-12-28) - -VERSION Bump Only. - -## 3.1.2 (2023-12-28) - -VERSION Bump Only. - -## 3.1.1 (2023-11-09) - - -### Features - -* add linea mainnet ([c3d1283](https://github.com/bcnmy/biconomy-client-sdk/commit/c3d12832002c18e187f910b5f7dac5ef5b797abf)) - - - -## 3.1.0 (2023-09-20) - - -### Bug Fixes - -* backend contract address ([e81188d](https://github.com/bcnmy/biconomy-client-sdk/commit/e81188d454eb42ab581078d218d86571d724fa2d)) -* build errors ([9fb0475](https://github.com/bcnmy/biconomy-client-sdk/commit/9fb047534935b0600bd08a4de7e68fd91a8a089a)) -* bundler sync changes ([eb9b30d](https://github.com/bcnmy/biconomy-client-sdk/commit/eb9b30d786820b4c9a6a18c72481d0ed3782a22e)) -* logic update ([41c4aec](https://github.com/bcnmy/biconomy-client-sdk/commit/41c4aec8ab5012b7ad362b2870966bd607e38636)) -* multisend bundle ([5f55587](https://github.com/bcnmy/biconomy-client-sdk/commit/5f55587b63c82a30652843fe619d8b891e495399)) -* optional sign flag ([0d689d2](https://github.com/bcnmy/biconomy-client-sdk/commit/0d689d214fc7abf32f4f2deabcce61041b73d642)) - - -### Features - -* base mainnet integration ([c17f5d6](https://github.com/bcnmy/biconomy-client-sdk/commit/c17f5d6c2fe34b106e6d9755f54fab2493db6fbe)) -* chain integration ([ddc5d91](https://github.com/bcnmy/biconomy-client-sdk/commit/ddc5d91d5df10a10266f4500644d24e0bc1ea684)) -* chain integration ([738556e](https://github.com/bcnmy/biconomy-client-sdk/commit/738556efcfda70fedc652befc0b35f8835c5e360)) -* chain integrations ([9af2da0](https://github.com/bcnmy/biconomy-client-sdk/commit/9af2da03820a26ac7d21301c32de041ced6c5e43)) -* fetching gas prices from bundler ([a0c070b](https://github.com/bcnmy/biconomy-client-sdk/commit/a0c070b04bb6e249388a7d304dad7d08e97810e1)) - - - - - -## 3.0.0 (2023-08-28) - -### Features - -- base mainnet integration ([c17f5d6](https://github.com/bcnmy/biconomy-client-sdk/commit/c17f5d6c2fe34b106e6d9755f54fab2493db6fbe)) - -# 3.1.0-alpha.0 (2023-07-24) - -VERSION Bump Only. - -# 3.1.0-alpha.0 (2023-07-24) - -### Features - -- chain integration ([738556e](https://github.com/bcnmy/biconomy-client-sdk/commit/738556efcfda70fedc652befc0b35f8835c5e360)) - -## 3.1.0-alpha.0 (2023-07-12) - -### Bug Fixes - -- bundler sync changes ([eb9b30d](https://github.com/bcnmy/biconomy-client-sdk/commit/eb9b30d786820b4c9a6a18c72481d0ed3782a22e)) - -## 2.0.2 (2023-06-10) - -- smart account state types to have factory address added - -## 2.0.1 (2023-05-18) - -### Bug Fixes - -- logic update ([41c4aec](https://github.com/bcnmy/biconomy-client-sdk/commit/41c4aec8ab5012b7ad362b2870966bd607e38636)) -- fix build issue in angular for relative path (https://github.com/bcnmy/biconomy-client-sdk/commit/eb9b30d786820b4c9a6a18c72481d0ed3782a22e) - -### Features - -- chain integrations ([9af2da0](https://github.com/bcnmy/biconomy-client-sdk/commit/9af2da03820a26ac7d21301c32de041ced6c5e43)) -- Type added for PaymasterServiceData + reordering of params ([fae8b3a](https://github.com/bcnmy/biconomy-client-sdk/commit/fae8b3a02a5e810a9a40674d27f389b89199bb62)) -- logic changed to accept paymasterServiceData ([6daaf37](https://github.com/bcnmy/biconomy-client-sdk/commit/6daaf37855a13fa6e12fdbab16a7e980b4631475)) -- UserOpGasFields for fetching gas and gas prices from bundler (https://github.com/bcnmy/biconomy-client-sdk/commit/a0c070b04bb6e249388a7d304dad7d08e97810e1) -- skipBundlerGasEstimation added in dto update CreateUserPaidTransactionDto ([487f3ae](https://github.com/bcnmy/biconomy-client-sdk/commit/487f3aefe21b2dd4fd46e18bef7168eae3c1ecc1)) -- fetching gas prices from bundler ([a0c070b](https://github.com/bcnmy/biconomy-client-sdk/commit/a0c070b04bb6e249388a7d304dad7d08e97810e1)) - -## 2.0.0 (2023-04-07) - -### Bug Fixes - -- backend contract address ([e81188d](https://github.com/bcnmy/biconomy-client-sdk/commit/e81188d454eb42ab581078d218d86571d724fa2d)) -- multisend bundle ([5f55587](https://github.com/bcnmy/biconomy-client-sdk/commit/5f55587b63c82a30652843fe619d8b891e495399)) -- optional sign flag ([0d689d2](https://github.com/bcnmy/biconomy-client-sdk/commit/0d689d214fc7abf32f4f2deabcce61041b73d642)) - -## 1.0.0 (2023-01-03) - -### Bug Fixes - -- optional sign flag ([0d689d2](https://github.com/bcnmy/biconomy-client-sdk/commit/0d689d214fc7abf32f4f2deabcce61041b73d642)) diff --git a/packages/core-types/README.md b/packages/core-types/README.md deleted file mode 100644 index 4fcf8c7bf..000000000 --- a/packages/core-types/README.md +++ /dev/null @@ -1,13 +0,0 @@ -# `@biconomy/core-types` - -# Biconomy SDK Types - -Common types in the [Biconomy SDK](https://github.com/bcnmy/biconomy-client-sdk) - -### Usage - -for example - -```typescript -import { SmartAccountState, SmartAccountVersion, GasLimit, ChainId } from "@biconomy/core-types"; -``` diff --git a/packages/core-types/package.json b/packages/core-types/package.json deleted file mode 100644 index 42d74006e..000000000 --- a/packages/core-types/package.json +++ /dev/null @@ -1,45 +0,0 @@ -{ - "name": "@biconomy/core-types", - "version": "3.1.3", - "description": "Biconomy Client SDK types", - "main": "./dist/src/index.js", - "typings": "./dist/src/index.d.ts", - "keywords": [ - "Ethereum", - "Gnosis", - "Biconomy", - "SDK" - ], - "scripts": { - "unbuild": "rimraf dist *.tsbuildinfo", - "build": "rimraf dist && tsc", - "format": "prettier --write \"{src,tests}/**/*.ts\"", - "lint": "tslint -p tsconfig.json" - }, - "author": "Biconomy (https://biconomy.io)", - "license": "MIT", - "files": [ - "dist/*", - "README.md" - ], - "devDependencies": { - "@types/node": "^17.0.23", - "@typescript-eslint/eslint-plugin": "^5.17.0", - "@typescript-eslint/parser": "^5.17.0", - "eslint": "^8.12.0", - "eslint-config-prettier": "^8.5.0", - "eslint-plugin-prettier": "^4.0.0", - "prettier": "^2.6.2", - "typescript": "^4.6.3" - }, - "publishConfig": { - "access": "public" - }, - "dependencies": { - "@ethersproject/bignumber": "^5.6.0", - "@ethersproject/contracts": "^5.6.0", - "@ethersproject/providers": "^5.7.0", - "ethers": "^5.7.2", - "web3-core": "^1.7.1" - } -} diff --git a/packages/core-types/src/BundlerTypes.ts b/packages/core-types/src/BundlerTypes.ts deleted file mode 100644 index 9397dc7fd..000000000 --- a/packages/core-types/src/BundlerTypes.ts +++ /dev/null @@ -1,8 +0,0 @@ -export type UserOpGasFields = { - maxPriorityFeePerGas: string | null; - maxFeePerGas: string | null; - gasPrice: string | null; - callGasLimit: number; - verificationGasLimit: number; - preVerificationGas: number; -}; diff --git a/packages/core-types/src/ChainsTypes.ts b/packages/core-types/src/ChainsTypes.ts deleted file mode 100644 index fa6c238a4..000000000 --- a/packages/core-types/src/ChainsTypes.ts +++ /dev/null @@ -1,39 +0,0 @@ -export enum ChainId { - // Ethereum - MAINNET = 1, - GOERLI = 5, - SEPOLIA = 11155111, - POLYGON_MUMBAI = 80001, - POLYGON_MAINNET = 137, - BSC_TESTNET = 97, - BSC_MAINNET = 56, - POLYGON_ZKEVM_TESTNET = 1442, - POLYGON_ZKEVM_MAINNET = 1101, - ARBITRUM_GOERLI_TESTNET = 421613, - ARBITRUM_SEPOLIA = 421614, - ARBITRUM_ONE_MAINNET = 42161, - ARBITRUM_NOVA_MAINNET = 42170, - OPTIMISM_MAINNET = 10, - OPTIMISM_GOERLI_TESTNET = 420, - AVALANCHE_MAINNET = 43114, - AVALANCHE_TESTNET = 43113, - MOONBEAM_MAINNET = 1284, - BASE_GOERLI_TESTNET = 84531, - BASE_MAINNET = 8453, - LINEA_TESTNET = 59140, - LINEA_MAINNET = 59144, - MANTLE_MAINNET = 5000, - MANTLE_TESTNET = 5001, - OPBNB_MAINNET = 204, - OPBNB_TESTNET = 5611, - ASTAR_MAINNET = 592, - ASTAR_TESTNET = 81, - CHILIZ_MAINNET = 88888, - CHILIZ_TESTNET = 88882, - CORE_MAINNET = 1116, - CORE_TESTNET = 1115, - MANTA_PACIFIC_MAINNET = 169, - MANTA_PACIFIC_TESTNET = 3441005, - CAPX_TESTNET = 7116, - GANACHE = 1337, //Temp -} diff --git a/packages/core-types/src/PaymasterServiceTypes.ts b/packages/core-types/src/PaymasterServiceTypes.ts deleted file mode 100644 index c5d3f4bb5..000000000 --- a/packages/core-types/src/PaymasterServiceTypes.ts +++ /dev/null @@ -1,6 +0,0 @@ -export type PaymasterServiceDataType = { - webhookData?: { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - [key: string]: any; - }; -}; diff --git a/packages/core-types/src/Types.ts b/packages/core-types/src/Types.ts deleted file mode 100644 index 529102c99..000000000 --- a/packages/core-types/src/Types.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { BigNumberish, BytesLike } from "ethers"; - -export type SmartAccountVersion = "1.0.1" | "1.0.0" | "1.0.2"; - -export type Transaction = { - to: string; - value?: BigNumberish; - data?: string; -}; - -export type UserOperation = { - sender: string; - nonce: BigNumberish; - initCode: BytesLike; - callData: BytesLike; - callGasLimit: BigNumberish; - verificationGasLimit: BigNumberish; - preVerificationGas: BigNumberish; - maxFeePerGas: BigNumberish; - maxPriorityFeePerGas: BigNumberish; - paymasterAndData: BytesLike; - signature: BytesLike; -}; - -export enum SmartAccountType { - BICONOMY, -} diff --git a/packages/core-types/src/index.ts b/packages/core-types/src/index.ts deleted file mode 100644 index dffce0c18..000000000 --- a/packages/core-types/src/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from "./Types"; -export * from "./ChainsTypes"; diff --git a/packages/core-types/tests/core-types.spec.ts b/packages/core-types/tests/core-types.spec.ts deleted file mode 100644 index 3f9a6a4bb..000000000 --- a/packages/core-types/tests/core-types.spec.ts +++ /dev/null @@ -1,5 +0,0 @@ -describe("Core Types Tests", () => { - it("should have a basic test", () => { - expect(true).toBe(true); - }); -}); diff --git a/packages/core-types/tsconfig.json b/packages/core-types/tsconfig.json deleted file mode 100644 index c7ff8535e..000000000 --- a/packages/core-types/tsconfig.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "extends": "../../tsconfig.settings.json", - "compilerOptions": { - "composite": true, - "outDir": "dist", - "baseUrl": "src" - }, - "include": ["src"] -} diff --git a/packages/modules/.esbuild.js b/packages/modules/.esbuild.js new file mode 100644 index 000000000..ca355e346 --- /dev/null +++ b/packages/modules/.esbuild.js @@ -0,0 +1,58 @@ +const esbuildPluginTsc = require("esbuild-plugin-tsc"); +const esbuild = require("esbuild"); +const { dependencies, peerDependencies = {} } = require("./package.json"); +const { Generator } = require("npm-dts"); + +const COMMON_SETTINGS = { + entryPoints: ["src/index.ts"], + minify: true, + bundle: true, + plugins: [esbuildPluginTsc({ force: true })], +}; + +const ESM_SETTINGS = { + ...COMMON_SETTINGS, + sourcemap: true, + outfile: "dist/esm/index.js", + platform: "browser", + target: "esnext", + format: "esm", + mainFields: ["browser", "module", "main"], +}; +const buildForESM = async () => await esbuild.build(ESM_SETTINGS); + +const CJS_SETTINGS = { + ...COMMON_SETTINGS, + format: "cjs", + sourcemap: false, + outfile: "dist/cjs/index.js", + platform: "node", +}; + +const watchForCJS = async () => { + let ctx = await esbuild.context(CJS_SETTINGS); + await ctx.watch(); + await ctx.serve({ servedir: "dist/src" }); + console.log("watching..."); +}; + +const buildForCJS = async () => await esbuild.build(CJS_SETTINGS); +const buildForTYP = async () => await new Generator({ entry: "src/index.ts", output: "dist/types/index.d.ts" }).generate(); + +(async () => { + const buildType = process.argv.slice(2)[0]; + const shouldWatch = process.argv.slice(3)[0] === "--watch"; + if (!buildType) { + console.log("No build type provided"); + process.exit(1); + } + console.log(`Building for ${buildType}`); + if (buildType === "ESM") { + await buildForESM(); + } else if (buildType === "CJS") { + console.log("watching? " + shouldWatch); + await (shouldWatch ? watchForCJS : buildForCJS)(); + } else if (buildType === "TYP") { + await buildForTYP(); + } +})(); diff --git a/packages/modules/CHANGELOG.md b/packages/modules/CHANGELOG.md index 3f5fcdb40..400a2d2a6 100644 --- a/packages/modules/CHANGELOG.md +++ b/packages/modules/CHANGELOG.md @@ -3,6 +3,12 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## 4.0.0 (2024-02-12) + +### Features + +- Export module create aliases from modules package ([d6205c](https://github.com/bcnmy/biconomy-client-sdk/pull/401/commits/d6205c4d76ab846ecdc10843c65e0277f3ceab00)) + ## 3.1.3 (2023-12-28) VERSION Bump Only. @@ -11,31 +17,28 @@ VERSION Bump Only. ### Bug Fixes -* Update import paths for consistency and fixing build issues ([ec5c3a3](https://github.com/bcnmy/biconomy-client-sdk/pull/332/commits/ec5c3a352e8caab6e94234264f4cd5cb32e5af3f)) +- Update import paths for consistency and fixing build issues ([ec5c3a3](https://github.com/bcnmy/biconomy-client-sdk/pull/332/commits/ec5c3a352e8caab6e94234264f4cd5cb32e5af3f)) ## 3.1.1 (2023-11-09) - ### Bug Fixes -* Fix update batched session router address and signing logic ([107b881](https://github.com/bcnmy/biconomy-client-sdk/commit/107b881da4b1a6da1f9db22ac54eda62f8c05b59)) - - +- Fix update batched session router address and signing logic ([107b881](https://github.com/bcnmy/biconomy-client-sdk/commit/107b881da4b1a6da1f9db22ac54eda62f8c05b59)) ## 3.1.0 (2023-09-20) -Modular Account Abstraction is here. -### Bug Fixes +Modular Account Abstraction is here. -* incorrect data merkleRoot length ([2e9d2dd](https://github.com/bcnmy/biconomy-client-sdk/commit/2e9d2dd5876a4de61af390d6595e1ab2cf8c137c)) -* lint warning and errors ([2135498](https://github.com/bcnmy/biconomy-client-sdk/commit/2135498896beb54d25add820c1521ffa22d5db7c)) -* more lint issues ([10df908](https://github.com/bcnmy/biconomy-client-sdk/commit/10df90821b473fd668907cf3e447dfe3825317fc)) -* signing issue ([f67e339](https://github.com/bcnmy/biconomy-client-sdk/commit/f67e339bcff8d9712df8406b4d123affcd4d4aa4)) -* sorting leaves always ([1fb908c](https://github.com/bcnmy/biconomy-client-sdk/commit/1fb908cb3b90abe4588c3a162ecf45c8afc80d81)) -* use hexZeroPad in leaf ([b3da05f](https://github.com/bcnmy/biconomy-client-sdk/commit/b3da05f2e9c56973e96d0a7a3bc065aef23f9c18)) -* use proof instead of root ([3a40a9d](https://github.com/bcnmy/biconomy-client-sdk/commit/3a40a9d8b9fb1fba8f660e5eab1fae1369f9f289)) +### Bug Fixes +- incorrect data merkleRoot length ([2e9d2dd](https://github.com/bcnmy/biconomy-client-sdk/commit/2e9d2dd5876a4de61af390d6595e1ab2cf8c137c)) +- lint warning and errors ([2135498](https://github.com/bcnmy/biconomy-client-sdk/commit/2135498896beb54d25add820c1521ffa22d5db7c)) +- more lint issues ([10df908](https://github.com/bcnmy/biconomy-client-sdk/commit/10df90821b473fd668907cf3e447dfe3825317fc)) +- signing issue ([f67e339](https://github.com/bcnmy/biconomy-client-sdk/commit/f67e339bcff8d9712df8406b4d123affcd4d4aa4)) +- sorting leaves always ([1fb908c](https://github.com/bcnmy/biconomy-client-sdk/commit/1fb908cb3b90abe4588c3a162ecf45c8afc80d81)) +- use hexZeroPad in leaf ([b3da05f](https://github.com/bcnmy/biconomy-client-sdk/commit/b3da05f2e9c56973e96d0a7a3bc065aef23f9c18)) +- use proof instead of root ([3a40a9d](https://github.com/bcnmy/biconomy-client-sdk/commit/3a40a9d8b9fb1fba8f660e5eab1fae1369f9f289)) ### Features -* add session key manager ([af41480](https://github.com/bcnmy/biconomy-client-sdk/commit/af41480ff1c88e2a4d0ee8605f2f01b3a958a1d9)) +- add session key manager ([af41480](https://github.com/bcnmy/biconomy-client-sdk/commit/af41480ff1c88e2a4d0ee8605f2f01b3a958a1d9)) diff --git a/packages/modules/package.json b/packages/modules/package.json index 68b5ff7c8..6defc5259 100644 --- a/packages/modules/package.json +++ b/packages/modules/package.json @@ -1,9 +1,19 @@ { "name": "@biconomy/modules", - "version": "3.1.3", + "version": "4.0.0", "description": "This package provides different validation modules/plugins for ERC4337 compatible modular account", - "main": "./dist/src/index.js", - "typings": "./dist/src/index.d.ts", + "main": "./dist/cjs/index.js", + "module": "./dist/esm/index.js", + "types": "./dist/types/index.d.ts", + "typings": "./dist/types/index.d.ts", + "exports": { + ".": { + "import": "./dist/esm/index.js", + "types": "./dist/types/index.d.ts", + "default": "./dist/cjs/index.js" + }, + "./package.json": "./package.json" + }, "keywords": [ "Smart Account", "ERC-4337", @@ -15,7 +25,16 @@ ], "scripts": { "unbuild": "rimraf dist *.tsbuildinfo", - "build": "rimraf dist && tsc", + "build:watch": "yarn build:tsc --watch", + "dist:minify": "esbuild ./dist/esm/**/*.js ./dist/esm/*.js --minify --outdir=./dist/esm --bundle=false --allow-overwrite", + "build": "yarn unbuild && yarn build:tsc", + "build:esbuild": "yarn build:esbuild:cjs && yarn build:esbuild:esm && yarn build:typ", + "build:tsc:cjs": "tsc --project tsconfig.build.json --module commonjs --outDir ./dist/cjs --removeComments --verbatimModuleSyntax false && echo > ./dist/cjs/package.json '{\"type\":\"commonjs\"}'", + "build:tsc:esm": "tsc --project tsconfig.build.json --module esnext --outDir ./dist/esm --removeComments && echo > ./dist/esm/package.json '{\"type\":\"module\"}'", + "build:esbuild:cjs": "node .esbuild.js CJS && echo > ./dist/cjs/package.json '{\"type\":\"commonjs\"}'", + "build:esbuild:esm": "node .esbuild.js ESM && echo > ./dist/esm/package.json '{\"type\":\"module\"}'", + "build:typ": "tsc --project tsconfig.build.json --module esnext --declarationDir ./dist/types --emitDeclarationOnly --declaration --declarationMap", + "build:tsc": "yarn build:tsc:cjs && yarn build:tsc:esm && yarn build:typ && yarn dist:minify", "test:file": "TS_NODE_PROJECT=../../tsconfig.json mocha -r ts-node/register --timeout 30000", "test:concurrently": "concurrently -k --success first 'yarn start:ganache > /dev/null'", "test:cov": "jest --coverage", @@ -24,7 +43,7 @@ "format": "prettier --write \"{src,tests}/**/*.ts\"", "lint": "tslint -p tsconfig.json" }, - "author": "livingrockrises ", + "author": "Biconomy", "license": "MIT", "files": [ "dist/*", @@ -34,12 +53,16 @@ "access": "public" }, "dependencies": { - "@alchemy/aa-core": "^1.2.2", - "@biconomy/common": "^3.1.3", - "@biconomy/core-types": "^3.1.3", - "@biconomy/node-client": "^3.1.3", - "ethereumjs-util": "^7.1.5", - "ethers": "^5.7.2", - "merkletreejs": "^0.3.9" + "@alchemy/aa-core": "3.0.0-alpha.4", + "@biconomy/common": "4.0.0", + "@ethersproject/abi": "^5.7.0", + "merkletreejs": "^0.3.11", + "viem": "^2.7.3" + }, + "devDependencies": { + "@types/node": "^20.11.10", + "esbuild": "^0.19.11", + "esbuild-plugin-tsc": "^0.4.0", + "npm-dts": "^1.3.12" } } diff --git a/packages/modules/src/BaseValidationModule.ts b/packages/modules/src/BaseValidationModule.ts index 1fc777e70..525fe122d 100644 --- a/packages/modules/src/BaseValidationModule.ts +++ b/packages/modules/src/BaseValidationModule.ts @@ -1,12 +1,11 @@ -import { Signer } from "ethers"; -import { Bytes } from "ethers/lib/utils"; -import { BaseValidationModuleConfig, ModuleInfo } from "./utils/Types"; -import { DEFAULT_ENTRYPOINT_ADDRESS } from "./utils/Constants"; -import { IValidationModule } from "./interfaces/IValidationModule"; -import { WalletClientSigner } from "@alchemy/aa-core"; +import { Hex } from "viem"; +import { SmartAccountSigner } from "@alchemy/aa-core"; +import { BaseValidationModuleConfig, ModuleInfo } from "./utils/Types.js"; +import { DEFAULT_ENTRYPOINT_ADDRESS } from "./utils/Constants.js"; +import { IValidationModule } from "./interfaces/IValidationModule.js"; export abstract class BaseValidationModule implements IValidationModule { - entryPointAddress: string; + entryPointAddress: Hex; constructor(moduleConfig: BaseValidationModuleConfig) { const { entryPointAddress } = moduleConfig; @@ -14,25 +13,25 @@ export abstract class BaseValidationModule implements IValidationModule { this.entryPointAddress = entryPointAddress || DEFAULT_ENTRYPOINT_ADDRESS; } - abstract getAddress(): string; + abstract getAddress(): Hex; - setEntryPointAddress(entryPointAddress: string): void { + setEntryPointAddress(entryPointAddress: Hex): void { this.entryPointAddress = entryPointAddress; } - abstract getInitData(): Promise; + abstract getInitData(): Promise; // Anything required to get dummy signature can be passed as params - abstract getDummySignature(_params?: ModuleInfo): Promise; + abstract getDummySignature(_params?: ModuleInfo): Promise; - abstract getSigner(): Promise; + abstract getSigner(): Promise; // Signer specific or any other additional information can be passed as params - abstract signUserOpHash(_userOpHash: string, _params?: ModuleInfo): Promise; + abstract signUserOpHash(_userOpHash: string, _params?: ModuleInfo): Promise; - abstract signMessage(_message: Bytes | string | Uint8Array): Promise; + abstract signMessage(_message: Uint8Array | string): Promise; - async signMessageWalletClientSigner(message: string | Uint8Array, signer: WalletClientSigner): Promise { + async signMessageSmartAccountSigner(message: string | Uint8Array, signer: SmartAccountSigner): Promise { let signature: `0x${string}` = await signer.signMessage(message); const potentiallyIncorrectV = parseInt(signature.slice(-2), 16); @@ -43,16 +42,4 @@ export abstract class BaseValidationModule implements IValidationModule { return signature; } - - async signMessageSigner(message: Bytes | string, signer: Signer): Promise { - let signature = await signer.signMessage(message); - - const potentiallyIncorrectV = parseInt(signature.slice(-2), 16); - if (![27, 28].includes(potentiallyIncorrectV)) { - const correctV = potentiallyIncorrectV + 27; - signature = signature.slice(0, -2) + correctV.toString(16); - } - - return signature; - } } diff --git a/packages/modules/src/BatchedSessionRouterModule.ts b/packages/modules/src/BatchedSessionRouterModule.ts index ffd273223..4c8847e17 100644 --- a/packages/modules/src/BatchedSessionRouterModule.ts +++ b/packages/modules/src/BatchedSessionRouterModule.ts @@ -1,26 +1,27 @@ -import { Signer, ethers } from "ethers"; -import { Logger } from "@biconomy/common"; -import { hexConcat, arrayify, hexZeroPad, defaultAbiCoder, Bytes } from "ethers/lib/utils"; -import { ModuleVersion, CreateSessionDataParams, BatchedSessionRouterModuleConfig, ModuleInfo, CreateSessionDataResponse } from "./utils/Types"; +import { ModuleVersion, CreateSessionDataParams, BatchedSessionRouterModuleConfig, ModuleInfo, CreateSessionDataResponse } from "./utils/Types.js"; import { BATCHED_SESSION_ROUTER_MODULE_ADDRESSES_BY_VERSION, DEFAULT_SESSION_KEY_MANAGER_MODULE, DEFAULT_BATCHED_SESSION_ROUTER_MODULE, -} from "./utils/Constants"; -import { BaseValidationModule } from "./BaseValidationModule"; -import { SessionKeyManagerModule } from "./SessionKeyManagerModule"; -import { SessionSearchParam, SessionStatus } from "./interfaces/ISessionStorage"; +} from "./utils/Constants.js"; +import { BaseValidationModule } from "./BaseValidationModule.js"; +import { SessionKeyManagerModule } from "./SessionKeyManagerModule.js"; +import { SessionSearchParam, SessionStatus } from "./interfaces/ISessionStorage.js"; +import { Hex, concat, encodeAbiParameters, keccak256, pad, parseAbiParameters, toBytes, toHex } from "viem"; +import { SmartAccountSigner } from "@alchemy/aa-core"; +import { convertSigner } from "@biconomy/common"; +import { defaultAbiCoder } from "@ethersproject/abi"; export class BatchedSessionRouterModule extends BaseValidationModule { version: ModuleVersion = "V1_0_0"; - moduleAddress!: string; + moduleAddress!: Hex; - sessionManagerModuleAddress!: string; + sessionManagerModuleAddress!: Hex; sessionKeyManagerModule!: SessionKeyManagerModule; - readonly mockEcdsaSessionKeySig: string = + readonly mockEcdsaSessionKeySig: Hex = "0x73c3ac716c487ca34bb858247b5ccf1dc354fbaabdd089af3b2ac8e78ba85a4959a2d76250325bd67c11771c31fccda87c33ceec17cc0de912690521bb95ffcb1b"; /** @@ -43,7 +44,7 @@ export class BatchedSessionRouterModule extends BaseValidationModule { if (moduleConfig.moduleAddress) { instance.moduleAddress = moduleConfig.moduleAddress; } else if (moduleConfig.version) { - const moduleAddr = BATCHED_SESSION_ROUTER_MODULE_ADDRESSES_BY_VERSION[moduleConfig.version]; + const moduleAddr = BATCHED_SESSION_ROUTER_MODULE_ADDRESSES_BY_VERSION[moduleConfig.version] as Hex; if (!moduleAddr) { throw new Error(`Invalid version ${moduleConfig.version}`); } @@ -89,7 +90,7 @@ export class BatchedSessionRouterModule extends BaseValidationModule { * @param sessionParams Information about all the sessions to be used to sign the user operation which has a batch execution * @returns The signature of the user operation */ - async signUserOpHash(userOpHash: string, params?: ModuleInfo): Promise { + async signUserOpHash(userOpHash: string, params?: ModuleInfo): Promise { const sessionParams = params?.batchSessionParams; if (!sessionParams || sessionParams.length === 0) { throw new Error("Session parameters are not provided"); @@ -98,9 +99,9 @@ export class BatchedSessionRouterModule extends BaseValidationModule { const sessionDataTupleArray = []; // signer must be the same for all the sessions - const sessionSigner = sessionParams[0].sessionSigner; + const { signer: sessionSigner } = await convertSigner(sessionParams[0].sessionSigner); - const signature = await sessionSigner.signMessage(arrayify(userOpHash)); + const signature = await sessionSigner.signMessage(toBytes(userOpHash)); for (const sessionParam of sessionParams) { if (!sessionParam.sessionSigner) { @@ -129,14 +130,14 @@ export class BatchedSessionRouterModule extends BaseValidationModule { sessionDataTuple.push(sessionSignerData.sessionValidationModule); sessionDataTuple.push(sessionSignerData.sessionKeyData); - const leafDataHex = hexConcat([ - hexZeroPad(ethers.utils.hexlify(sessionSignerData.validUntil), 6), - hexZeroPad(ethers.utils.hexlify(sessionSignerData.validAfter), 6), - hexZeroPad(sessionSignerData.sessionValidationModule, 20), + const leafDataHex = concat([ + pad(toHex(sessionSignerData.validUntil), { size: 6 }), + pad(toHex(sessionSignerData.validAfter), { size: 6 }), + pad(sessionSignerData.sessionValidationModule, { size: 20 }), sessionSignerData.sessionKeyData, ]); - const proof = this.sessionKeyManagerModule.merkleTree.getHexProof(ethers.utils.keccak256(leafDataHex) as unknown as Buffer); + const proof = this.sessionKeyManagerModule.merkleTree.getHexProof(keccak256(leafDataHex)); sessionDataTuple.push(proof); sessionDataTuple.push(sessionParam.additionalSessionData ?? "0x"); @@ -151,7 +152,7 @@ export class BatchedSessionRouterModule extends BaseValidationModule { [this.getSessionKeyManagerAddress(), sessionDataTupleArray, signature], ); - return paddedSignature; + return paddedSignature as Hex; } /** @@ -175,21 +176,21 @@ export class BatchedSessionRouterModule extends BaseValidationModule { /** * @returns SessionKeyManagerModule address */ - getAddress(): string { + getAddress(): Hex { return this.moduleAddress; } /** * @returns SessionKeyManagerModule address */ - getSessionKeyManagerAddress(): string { + getSessionKeyManagerAddress(): Hex { return this.sessionManagerModuleAddress; } /** * @remarks This is the version of the module contract */ - async getSigner(): Promise { + async getSigner(): Promise { throw new Error("Method not implemented."); } @@ -197,7 +198,7 @@ export class BatchedSessionRouterModule extends BaseValidationModule { * @remarks This is the dummy signature for the module, used in buildUserOp for bundler estimation * @returns Dummy signature */ - async getDummySignature(params?: ModuleInfo): Promise { + async getDummySignature(params?: ModuleInfo): Promise { const sessionParams = params?.batchSessionParams; if (!sessionParams || sessionParams.length === 0) { throw new Error("Session parameters are not provided"); @@ -208,7 +209,7 @@ export class BatchedSessionRouterModule extends BaseValidationModule { // if needed we could do mock signature over userOpHashAndModuleAddress // signer must be the same for all the sessions - const sessionSigner = sessionParams[0].sessionSigner; + const { signer: sessionSigner } = await convertSigner(sessionParams[0].sessionSigner); for (const sessionParam of sessionParams) { if (!sessionParam.sessionSigner) { @@ -232,19 +233,19 @@ export class BatchedSessionRouterModule extends BaseValidationModule { throw new Error("sessionID or sessionValidationModule should be provided."); } - sessionDataTuple.push(sessionSignerData.validUntil); - sessionDataTuple.push(sessionSignerData.validAfter); + sessionDataTuple.push(BigInt(sessionSignerData.validUntil)); + sessionDataTuple.push(BigInt(sessionSignerData.validAfter)); sessionDataTuple.push(sessionSignerData.sessionValidationModule); sessionDataTuple.push(sessionSignerData.sessionKeyData); - const leafDataHex = hexConcat([ - hexZeroPad(ethers.utils.hexlify(sessionSignerData.validUntil), 6), - hexZeroPad(ethers.utils.hexlify(sessionSignerData.validAfter), 6), - hexZeroPad(sessionSignerData.sessionValidationModule, 20), + const leafDataHex = concat([ + pad(toHex(sessionSignerData.validUntil), { size: 6 }), + pad(toHex(sessionSignerData.validAfter), { size: 6 }), + pad(sessionSignerData.sessionValidationModule, { size: 20 }), sessionSignerData.sessionKeyData, ]); - const proof = this.sessionKeyManagerModule.merkleTree.getHexProof(ethers.utils.keccak256(leafDataHex) as unknown as Buffer); + const proof = this.sessionKeyManagerModule.merkleTree.getHexProof(keccak256(leafDataHex)); sessionDataTuple.push(proof); sessionDataTuple.push(sessionParam.additionalSessionData ?? "0x"); @@ -253,29 +254,26 @@ export class BatchedSessionRouterModule extends BaseValidationModule { } // Generate the padded signature - const paddedSignature = defaultAbiCoder.encode( ["address", "tuple(uint48,uint48,address,bytes,bytes32[],bytes)[]", "bytes"], [this.getSessionKeyManagerAddress(), sessionDataTupleArray, this.mockEcdsaSessionKeySig], ); - const dummySig = ethers.utils.defaultAbiCoder.encode(["bytes", "address"], [paddedSignature, this.getAddress()]); - + const dummySig = encodeAbiParameters(parseAbiParameters("bytes, address"), [paddedSignature as Hex, this.getAddress()]); return dummySig; } /** * @remarks Other modules may need additional attributes to build init data */ - async getInitData(): Promise { + async getInitData(): Promise { throw new Error("Method not implemented."); } /** * @remarks This Module dont have knowledge of signer. So, this method is not implemented */ - async signMessage(message: Bytes | string): Promise { - Logger.log("message", message); + async signMessage(_message: Uint8Array | string): Promise { throw new Error("Method not implemented."); } } diff --git a/packages/modules/src/ECDSAOwnershipValidationModule.ts b/packages/modules/src/ECDSAOwnershipValidationModule.ts index 613623560..737a43d07 100644 --- a/packages/modules/src/ECDSAOwnershipValidationModule.ts +++ b/packages/modules/src/ECDSAOwnershipValidationModule.ts @@ -1,29 +1,34 @@ -import { Logger } from "@biconomy/common"; -import { Signer, ethers } from "ethers"; -import { Bytes, arrayify } from "ethers/lib/utils"; -import { ECDSAOwnershipValidationModuleConfig, ModuleVersion } from "./utils/Types"; -import { DEFAULT_ECDSA_OWNERSHIP_MODULE, ECDSA_OWNERSHIP_MODULE_ADDRESSES_BY_VERSION } from "./utils/Constants"; -import { BaseValidationModule } from "./BaseValidationModule"; -import { WalletClientSigner } from "@alchemy/aa-core"; +import { Hex, encodeFunctionData, getAddress, parseAbi, toBytes } from "viem"; +import { SmartAccountSigner } from "@alchemy/aa-core"; +import { ECDSAOwnershipValidationModuleConfig, ECDSAOwnershipValidationModuleConfigConstructorProps, ModuleVersion } from "./utils/Types.js"; +import { DEFAULT_ECDSA_OWNERSHIP_MODULE, ECDSA_OWNERSHIP_MODULE_ADDRESSES_BY_VERSION } from "./utils/Constants.js"; +import { convertSigner } from "@biconomy/common"; +import { BaseValidationModule } from "./BaseValidationModule.js"; // Could be renamed with suffix API export class ECDSAOwnershipValidationModule extends BaseValidationModule { - signer!: Signer | WalletClientSigner; + signer: SmartAccountSigner; - moduleAddress!: string; + moduleAddress!: Hex; version: ModuleVersion = "V1_0_0"; - private constructor(moduleConfig: ECDSAOwnershipValidationModuleConfig) { + private constructor(moduleConfig: ECDSAOwnershipValidationModuleConfigConstructorProps) { super(moduleConfig); + this.signer = moduleConfig.signer; } public static async create(moduleConfig: ECDSAOwnershipValidationModuleConfig): Promise { - const instance = new ECDSAOwnershipValidationModule(moduleConfig); + // Signer needs to be initialised here before defaultValidationModule is set + const { signer } = await convertSigner(moduleConfig.signer, true); + const configForConstructor: ECDSAOwnershipValidationModuleConfigConstructorProps = { ...moduleConfig, signer }; + + // TODO: (Joe) stop doing things in a 'create' call after the instance has been created + const instance = new ECDSAOwnershipValidationModule(configForConstructor); if (moduleConfig.moduleAddress) { instance.moduleAddress = moduleConfig.moduleAddress; } else if (moduleConfig.version) { - const moduleAddr = ECDSA_OWNERSHIP_MODULE_ADDRESSES_BY_VERSION[moduleConfig.version]; + const moduleAddr = ECDSA_OWNERSHIP_MODULE_ADDRESSES_BY_VERSION[moduleConfig.version] as Hex; if (!moduleAddr) { throw new Error(`Invalid version ${moduleConfig.version}`); } @@ -33,55 +38,55 @@ export class ECDSAOwnershipValidationModule extends BaseValidationModule { instance.moduleAddress = DEFAULT_ECDSA_OWNERSHIP_MODULE; // Note: in this case Version remains the default one } - instance.signer = moduleConfig.signer; return instance; } - getAddress(): string { + getAddress(): Hex { return this.moduleAddress; } - async getSigner(): Promise { + async getSigner(): Promise { return Promise.resolve(this.signer); } - async getDummySignature(): Promise { - const moduleAddress = ethers.utils.getAddress(this.getAddress()); + async getDummySignature(): Promise { + const moduleAddress = getAddress(this.getAddress()); const dynamicPart = moduleAddress.substring(2).padEnd(40, "0"); return `0x0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000${dynamicPart}000000000000000000000000000000000000000000000000000000000000004181d4b4981670cb18f99f0b4a66446df1bf5b204d24cfcb659bf38ba27a4359b5711649ec2423c5e1247245eba2964679b6a1dbb85c992ae40b9b00c6935b02ff1b00000000000000000000000000000000000000000000000000000000000000`; } // Note: other modules may need additional attributes to build init data - async getInitData(): Promise { + async getInitData(): Promise { const ecdsaOwnerAddress = await this.signer.getAddress(); - const moduleRegistryAbi = "function initForSmartAccount(address owner)"; - const ecdsaModuleRegistryInterface = new ethers.utils.Interface([moduleRegistryAbi]); - const ecdsaOwnershipInitData = ecdsaModuleRegistryInterface.encodeFunctionData("initForSmartAccount", [ecdsaOwnerAddress]); + const moduleRegistryParsedAbi = parseAbi(["function initForSmartAccount(address owner)"]); + const ecdsaOwnershipInitData = encodeFunctionData({ + abi: moduleRegistryParsedAbi, + functionName: "initForSmartAccount", + args: [ecdsaOwnerAddress], + }); return ecdsaOwnershipInitData; } - async signUserOpHash(userOpHash: string): Promise { - const sig = await this.signer.signMessage(arrayify(userOpHash)); - - Logger.log("ecdsa signature ", sig); - + async signUserOpHash(userOpHash: string): Promise { + const sig = await this.signer.signMessage(toBytes(userOpHash)); return sig; } /** * Signs a message using the appropriate method based on the type of signer. * - * @param {Bytes | string | Uint8Array} message - The message to be signed. + * @param {Uint8Array | string} message - The message to be signed. * @returns {Promise} A promise resolving to the signature or error message. * @throws {Error} If the signer type is invalid or unsupported. */ - async signMessage(message: Bytes | string | Uint8Array): Promise { - if (this.signer instanceof WalletClientSigner) { - return super.signMessageWalletClientSigner(message as Uint8Array | string, this.signer as WalletClientSigner); - } else if (this.signer instanceof Signer) { - return super.signMessageSigner(message as Bytes | string, this.signer as Signer); - } else { - throw new Error("Invalid signer type"); + async signMessage(message: Uint8Array | string): Promise { + let signature = await this.signer.signMessage(message); + + const potentiallyIncorrectV = parseInt(signature.slice(-2), 16); + if (![27, 28].includes(potentiallyIncorrectV)) { + const correctV = potentiallyIncorrectV + 27; + signature = signature.slice(0, -2) + correctV.toString(16); } + return signature; } } diff --git a/packages/modules/src/MultichainValidationModule.ts b/packages/modules/src/MultichainValidationModule.ts index 3398fdc1c..e51aae190 100644 --- a/packages/modules/src/MultichainValidationModule.ts +++ b/packages/modules/src/MultichainValidationModule.ts @@ -1,29 +1,40 @@ -import { UserOperation } from "@biconomy/core-types"; -import { Logger, getUserOpHash } from "@biconomy/common"; -import { Signer, ethers } from "ethers"; -import MerkleTree from "merkletreejs"; -import { DEFAULT_MULTICHAIN_MODULE, MULTICHAIN_VALIDATION_MODULE_ADDRESSES_BY_VERSION } from "./utils/Constants"; -import { keccak256, arrayify, defaultAbiCoder, hexConcat, hexZeroPad, Bytes } from "ethers/lib/utils"; -import { ModuleVersion, MultiChainUserOpDto, MultiChainValidationModuleConfig } from "./utils/Types"; -import { BaseValidationModule } from "./BaseValidationModule"; -import { WalletClientSigner } from "@alchemy/aa-core"; +import { Hex, concat, encodeAbiParameters, encodeFunctionData, getAddress, keccak256, pad, parseAbi, parseAbiParameters, toBytes, toHex } from "viem"; +import { UserOperationStruct, SmartAccountSigner } from "@alchemy/aa-core"; +import { MerkleTree } from "merkletreejs"; +import { DEFAULT_MULTICHAIN_MODULE, MULTICHAIN_VALIDATION_MODULE_ADDRESSES_BY_VERSION } from "./utils/Constants.js"; +import { + ModuleVersion, + MultiChainUserOpDto, + MultiChainValidationModuleConfig, + MultiChainValidationModuleConfigConstructorProps, +} from "./utils/Types.js"; +import { BaseValidationModule } from "./BaseValidationModule.js"; +import { getUserOpHash } from "./utils/Helper.js"; +import { convertSigner, Logger } from "@biconomy/common"; + export class MultiChainValidationModule extends BaseValidationModule { - signer!: Signer | WalletClientSigner; + signer: SmartAccountSigner; - moduleAddress!: string; + moduleAddress!: Hex; version: ModuleVersion = "V1_0_0"; - private constructor(moduleConfig: MultiChainValidationModuleConfig) { + private constructor(moduleConfig: MultiChainValidationModuleConfigConstructorProps) { super(moduleConfig); + this.signer = moduleConfig.signer; } public static async create(moduleConfig: MultiChainValidationModuleConfig): Promise { - const instance = new MultiChainValidationModule(moduleConfig); + // Signer needs to be initialised here before defaultValidationModule is set + const { signer } = await convertSigner(moduleConfig.signer, true); + const configForConstructor: MultiChainValidationModuleConfigConstructorProps = { ...moduleConfig, signer }; + + // TODO: (Joe) stop doing things in a 'create' call after the instance has been created + const instance = new MultiChainValidationModule(configForConstructor); if (moduleConfig.moduleAddress) { instance.moduleAddress = moduleConfig.moduleAddress; } else if (moduleConfig.version) { - const moduleAddr = MULTICHAIN_VALIDATION_MODULE_ADDRESSES_BY_VERSION[moduleConfig.version]; + const moduleAddr = MULTICHAIN_VALIDATION_MODULE_ADDRESSES_BY_VERSION[moduleConfig.version] as Hex; if (!moduleAddr) { throw new Error(`Invalid version ${moduleConfig.version}`); } @@ -33,59 +44,59 @@ export class MultiChainValidationModule extends BaseValidationModule { instance.moduleAddress = DEFAULT_MULTICHAIN_MODULE; // Note: in this case Version remains the default one } - instance.signer = moduleConfig.signer; return instance; } - getAddress(): string { + getAddress(): Hex { return this.moduleAddress; } - async getSigner(): Promise { + async getSigner(): Promise { return Promise.resolve(this.signer); } - async getDummySignature(): Promise { - const moduleAddress = ethers.utils.getAddress(this.getAddress()); + async getDummySignature(): Promise { + const moduleAddress = getAddress(this.getAddress()); const dynamicPart = moduleAddress.substring(2).padEnd(40, "0"); return `0x0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000${dynamicPart}000000000000000000000000000000000000000000000000000000000000004181d4b4981670cb18f99f0b4a66446df1bf5b204d24cfcb659bf38ba27a4359b5711649ec2423c5e1247245eba2964679b6a1dbb85c992ae40b9b00c6935b02ff1b00000000000000000000000000000000000000000000000000000000000000`; } // Note: other modules may need additional attributes to build init data - async getInitData(): Promise { + async getInitData(): Promise { const ecdsaOwnerAddress = await this.signer.getAddress(); - const moduleRegistryAbi = "function initForSmartAccount(address owner)"; - const ecdsaModuleRegistryInterface = new ethers.utils.Interface([moduleRegistryAbi]); - const ecdsaOwnershipInitData = ecdsaModuleRegistryInterface.encodeFunctionData("initForSmartAccount", [ecdsaOwnerAddress]); + const moduleRegistryParsedAbi = parseAbi(["function initForSmartAccount(address owner)"]); + const ecdsaOwnershipInitData = encodeFunctionData({ + abi: moduleRegistryParsedAbi, + functionName: "initForSmartAccount", + args: [ecdsaOwnerAddress], + }); return ecdsaOwnershipInitData; } - async signUserOpHash(userOpHash: string): Promise { - const sig = await this.signer.signMessage(arrayify(userOpHash)); - - Logger.log("ecdsa signature ", sig); - + async signUserOpHash(userOpHash: string): Promise { + const sig = await this.signer.signMessage(toBytes(userOpHash)); return sig; } /** * Signs a message using the appropriate method based on the type of signer. * - * @param {Bytes | string | Uint8Array} message - The message to be signed. + * @param {Uint8Array | string} message - The message to be signed. * @returns {Promise} A promise resolving to the signature or error message. * @throws {Error} If the signer type is invalid or unsupported. */ - async signMessage(message: Bytes | string | Uint8Array): Promise { - if (this.signer instanceof WalletClientSigner) { - return super.signMessageWalletClientSigner(message as Uint8Array | string, this.signer as WalletClientSigner); - } else if (this.signer instanceof Signer) { - return super.signMessageSigner(message as Bytes | string, this.signer as Signer); - } else { - throw new Error("Invalid signer type"); + async signMessage(message: Uint8Array | string): Promise { + let signature = await this.signer.signMessage(message); + + const potentiallyIncorrectV = parseInt(signature.slice(-2), 16); + if (![27, 28].includes(potentiallyIncorrectV)) { + const correctV = potentiallyIncorrectV + 27; + signature = signature.slice(0, -2) + correctV.toString(16); } + return signature; } - async signUserOps(multiChainUserOps: MultiChainUserOpDto[]): Promise { + async signUserOps(multiChainUserOps: MultiChainUserOpDto[]): Promise { try { const leaves: string[] = []; @@ -93,10 +104,10 @@ export class MultiChainValidationModule extends BaseValidationModule { for (const multiChainOp of multiChainUserOps) { const validUntil = multiChainOp.validUntil ?? 0; const validAfter = multiChainOp.validAfter ?? 0; - const leaf = hexConcat([ - hexZeroPad(ethers.utils.hexlify(validUntil), 6), - hexZeroPad(ethers.utils.hexlify(validAfter), 6), - hexZeroPad(getUserOpHash(multiChainOp.userOp, this.entryPointAddress, multiChainOp.chainId), 32), + const leaf = concat([ + pad(toHex(validUntil), { size: 6 }), + pad(toHex(validAfter), { size: 6 }), + pad(getUserOpHash(multiChainOp.userOp, this.entryPointAddress, multiChainOp.chainId), { size: 32 }), ]); leaves.push(keccak256(leaf)); @@ -105,7 +116,7 @@ export class MultiChainValidationModule extends BaseValidationModule { // Create a new Merkle tree using the leaves array const merkleTree = new MerkleTree(leaves, keccak256, { sortPairs: true }); - let multichainSignature = await this.signer.signMessage(arrayify(merkleTree.getHexRoot())); + let multichainSignature = await this.signer.signMessage(toBytes(merkleTree.getHexRoot())); const potentiallyIncorrectV = parseInt(multichainSignature.slice(-2), 16); if (![27, 28].includes(potentiallyIncorrectV)) { @@ -114,38 +125,37 @@ export class MultiChainValidationModule extends BaseValidationModule { } // Create an array to store updated userOps - const updatedUserOps: UserOperation[] = []; - - Logger.log("merkle root ", merkleTree.getHexRoot()); + const updatedUserOps: UserOperationStruct[] = []; for (let i = 0; i < leaves.length; i++) { const merkleProof = merkleTree.getHexProof(leaves[i]); - Logger.log("merkle proof ", merkleProof); - const validUntil = multiChainUserOps[i].validUntil ?? 0; const validAfter = multiChainUserOps[i].validAfter ?? 0; // Create the moduleSignature - const moduleSignature = defaultAbiCoder.encode( - ["uint48", "uint48", "bytes32", "bytes32[]", "bytes"], - [validUntil, validAfter, merkleTree.getHexRoot(), merkleProof, multichainSignature], - ); + const moduleSignature = encodeAbiParameters(parseAbiParameters(["uint48, uint48, bytes32, bytes32[], bytes"]), [ + validUntil, + validAfter, + merkleTree.getHexRoot() as Hex, + merkleProof as Hex[], + multichainSignature as Hex, + ]); // Note: Because accountV2 does not directly call this method. hence we need to add validation module address to the signature - const signatureWithModuleAddress = defaultAbiCoder.encode(["bytes", "address"], [moduleSignature, this.getAddress()]); + const signatureWithModuleAddress = encodeAbiParameters(parseAbiParameters(["bytes, address"]), [moduleSignature, this.getAddress()]); // Update userOp with the final signature - const updatedUserOp: UserOperation = { - ...(multiChainUserOps[i].userOp as UserOperation), - signature: signatureWithModuleAddress, + const updatedUserOp: UserOperationStruct = { + ...(multiChainUserOps[i].userOp as UserOperationStruct), + signature: signatureWithModuleAddress as `0x${string}`, }; updatedUserOps.push(updatedUserOp); } return updatedUserOps; } catch (error) { - Logger.error("Error in signing multi chain userops", error); + Logger.error("Error in signing multi chain userops"); throw new Error(JSON.stringify(error)); } } diff --git a/packages/modules/src/SessionKeyManagerModule.ts b/packages/modules/src/SessionKeyManagerModule.ts index 23e0b8770..f8e49d859 100644 --- a/packages/modules/src/SessionKeyManagerModule.ts +++ b/packages/modules/src/SessionKeyManagerModule.ts @@ -1,8 +1,6 @@ -import { Signer, ethers } from "ethers"; -import MerkleTree from "merkletreejs"; -import { NODE_CLIENT_URL, Logger } from "@biconomy/common"; -import { hexConcat, arrayify, hexZeroPad, defaultAbiCoder, Bytes } from "ethers/lib/utils"; -import { keccak256 } from "ethereumjs-util"; +import { Hex, concat, encodeAbiParameters, encodeFunctionData, keccak256, pad, parseAbi, parseAbiParameters, toBytes, toHex } from "viem"; +import { MerkleTree } from "merkletreejs"; +import { SmartAccountSigner } from "@alchemy/aa-core"; import { SessionKeyManagerModuleConfig, ModuleVersion, @@ -10,27 +8,24 @@ import { ModuleInfo, CreateSessionDataResponse, StorageType, -} from "./utils/Types"; -import NodeClient from "@biconomy/node-client"; -import INodeClient from "@biconomy/node-client"; -import { SESSION_MANAGER_MODULE_ADDRESSES_BY_VERSION, DEFAULT_SESSION_KEY_MANAGER_MODULE } from "./utils/Constants"; -import { generateRandomHex } from "./utils/Uid"; -import { BaseValidationModule } from "./BaseValidationModule"; -import { SessionLocalStorage } from "./session-storage/SessionLocalStorage"; -import { ISessionStorage, SessionLeafNode, SessionSearchParam, SessionStatus } from "./interfaces/ISessionStorage"; +} from "./utils/Types.js"; +import { SESSION_MANAGER_MODULE_ADDRESSES_BY_VERSION, DEFAULT_SESSION_KEY_MANAGER_MODULE } from "./utils/Constants.js"; +import { generateRandomHex } from "./utils/Uid.js"; +import { BaseValidationModule } from "./BaseValidationModule.js"; +import { SessionLocalStorage } from "./session-storage/SessionLocalStorage.js"; +import { ISessionStorage, SessionLeafNode, SessionSearchParam, SessionStatus } from "./interfaces/ISessionStorage.js"; +import { convertSigner } from "@biconomy/common"; export class SessionKeyManagerModule extends BaseValidationModule { version: ModuleVersion = "V1_0_0"; - moduleAddress!: string; - - nodeClient!: INodeClient; + moduleAddress!: Hex; merkleTree!: MerkleTree; sessionStorageClient!: ISessionStorage; - readonly mockEcdsaSessionKeySig: string = + readonly mockEcdsaSessionKeySig: Hex = "0x73c3ac716c487ca34bb858247b5ccf1dc354fbaabdd089af3b2ac8e78ba85a4959a2d76250325bd67c11771c31fccda87c33ceec17cc0de912690521bb95ffcb1b"; /** @@ -48,12 +43,13 @@ export class SessionKeyManagerModule extends BaseValidationModule { * @returns A Promise that resolves to an instance of SessionKeyManagerModule */ public static async create(moduleConfig: SessionKeyManagerModuleConfig): Promise { + // TODO: (Joe) stop doing things in a 'create' call after the instance has been created const instance = new SessionKeyManagerModule(moduleConfig); if (moduleConfig.moduleAddress) { instance.moduleAddress = moduleConfig.moduleAddress; } else if (moduleConfig.version) { - const moduleAddr = SESSION_MANAGER_MODULE_ADDRESSES_BY_VERSION[moduleConfig.version]; + const moduleAddr = SESSION_MANAGER_MODULE_ADDRESSES_BY_VERSION[moduleConfig.version] as Hex; if (!moduleAddr) { throw new Error(`Invalid version ${moduleConfig.version}`); } @@ -63,9 +59,6 @@ export class SessionKeyManagerModule extends BaseValidationModule { instance.moduleAddress = DEFAULT_SESSION_KEY_MANAGER_MODULE; // Note: in this case Version remains the default one } - instance.nodeClient = new NodeClient({ - txServiceUrl: moduleConfig.nodeClientUrl ?? NODE_CLIENT_URL, - }); if (moduleConfig.sessionStorageClient) { instance.sessionStorageClient = moduleConfig.sessionStorageClient; @@ -81,13 +74,13 @@ export class SessionKeyManagerModule extends BaseValidationModule { const existingSessionData = await instance.sessionStorageClient.getAllSessionData(); const existingSessionDataLeafs = existingSessionData.map((sessionData) => { - const leafDataHex = hexConcat([ - hexZeroPad(ethers.utils.hexlify(sessionData.validUntil), 6), - hexZeroPad(ethers.utils.hexlify(sessionData.validAfter), 6), - hexZeroPad(sessionData.sessionValidationModule, 20), + const leafDataHex = concat([ + pad(toHex(sessionData.validUntil), { size: 6 }), + pad(toHex(sessionData.validAfter), { size: 6 }), + pad(sessionData.sessionValidationModule, { size: 20 }), sessionData.sessionKeyData, ]); - return ethers.utils.keccak256(leafDataHex); + return keccak256(leafDataHex); }); instance.merkleTree = new MerkleTree(existingSessionDataLeafs, keccak256, { @@ -104,22 +97,23 @@ export class SessionKeyManagerModule extends BaseValidationModule { * @returns The session data */ createSessionData = async (leavesData: CreateSessionDataParams[]): Promise => { - const sessionKeyManagerModuleABI = "function setMerkleRoot(bytes32 _merkleRoot)"; - const sessionKeyManagerModuleInterface = new ethers.utils.Interface([sessionKeyManagerModuleABI]); + const sessionKeyManagerModuleABI = parseAbi(["function setMerkleRoot(bytes32 _merkleRoot)"]); + const leavesToAdd: Buffer[] = []; const sessionIDInfo: string[] = []; for (const leafData of leavesData) { - const leafDataHex = hexConcat([ - hexZeroPad(ethers.utils.hexlify(leafData.validUntil), 6), - hexZeroPad(ethers.utils.hexlify(leafData.validAfter), 6), - hexZeroPad(leafData.sessionValidationModule, 20), + const leafDataHex = concat([ + pad(toHex(leafData.validUntil), { size: 6 }), + pad(toHex(leafData.validAfter), { size: 6 }), + pad(leafData.sessionValidationModule, { size: 20 }), leafData.sessionKeyData, ]); const generatedSessionId = leafData.preferredSessionId ?? generateRandomHex(); - leavesToAdd.push(ethers.utils.keccak256(leafDataHex) as unknown as Buffer); + // TODO: verify this, might not be buffer + leavesToAdd.push(keccak256(leafDataHex) as unknown as Buffer); sessionIDInfo.push(generatedSessionId); const sessionLeafNode = { @@ -142,7 +136,11 @@ export class SessionKeyManagerModule extends BaseValidationModule { this.merkleTree = newMerkleTree; - const setMerkleRootData = sessionKeyManagerModuleInterface.encodeFunctionData("setMerkleRoot", [this.merkleTree.getHexRoot()]); + const setMerkleRootData = encodeFunctionData({ + abi: sessionKeyManagerModuleABI, + functionName: "setMerkleRoot", + args: [this.merkleTree.getHexRoot() as Hex], + }); await this.sessionStorageClient.setMerkleRoot(this.merkleTree.getHexRoot()); return { @@ -157,48 +155,46 @@ export class SessionKeyManagerModule extends BaseValidationModule { * @param sessionSigner The signer to be used to sign the user operation * @returns The signature of the user operation */ - async signUserOpHash(userOpHash: string, params?: ModuleInfo): Promise { + async signUserOpHash(userOpHash: string, params?: ModuleInfo): Promise { if (!(params && params.sessionSigner)) { throw new Error("Session signer is not provided."); } - const sessionSigner = params.sessionSigner; + const { signer: sessionSigner } = await convertSigner(params.sessionSigner); + // Use the sessionSigner to sign the user operation - const signature = await sessionSigner.signMessage(arrayify(userOpHash)); + const signature = await sessionSigner.signMessage(toBytes(userOpHash)); const sessionSignerData = await this.getLeafInfo(params); - const leafDataHex = hexConcat([ - hexZeroPad(ethers.utils.hexlify(sessionSignerData.validUntil), 6), - hexZeroPad(ethers.utils.hexlify(sessionSignerData.validAfter), 6), - hexZeroPad(sessionSignerData.sessionValidationModule, 20), + const leafDataHex = concat([ + pad(toHex(sessionSignerData.validUntil), { size: 6 }), + pad(toHex(sessionSignerData.validAfter), { size: 6 }), + pad(sessionSignerData.sessionValidationModule, { size: 20 }), sessionSignerData.sessionKeyData, ]); // Generate the padded signature with (validUntil,validAfter,sessionVerificationModuleAddress,validationData,merkleProof,signature) - let paddedSignature = defaultAbiCoder.encode( - ["uint48", "uint48", "address", "bytes", "bytes32[]", "bytes"], - [ - sessionSignerData.validUntil, - sessionSignerData.validAfter, - sessionSignerData.sessionValidationModule, - sessionSignerData.sessionKeyData, - this.merkleTree.getHexProof(ethers.utils.keccak256(leafDataHex) as unknown as Buffer), - signature, - ], - ); + let paddedSignature: Hex = encodeAbiParameters(parseAbiParameters("uint48, uint48, address, bytes, bytes32[], bytes"), [ + sessionSignerData.validUntil, + sessionSignerData.validAfter, + sessionSignerData.sessionValidationModule, + sessionSignerData.sessionKeyData, + this.merkleTree.getHexProof(keccak256(leafDataHex)) as Hex[], + signature, + ]); if (params?.additionalSessionData) { paddedSignature += params.additionalSessionData; } - return paddedSignature; + return paddedSignature as Hex; } private async getLeafInfo(params: ModuleInfo): Promise { if (!(params && params.sessionSigner)) { throw new Error("Session signer is not provided."); } - const sessionSigner = params.sessionSigner; + const { signer: sessionSigner } = await convertSigner(params.sessionSigner); let sessionSignerData; if (params?.sessionID) { sessionSignerData = await this.sessionStorageClient.getSessionData({ @@ -237,14 +233,14 @@ export class SessionKeyManagerModule extends BaseValidationModule { /** * @returns SessionKeyManagerModule address */ - getAddress(): string { + getAddress(): Hex { return this.moduleAddress; } /** * @remarks This is the version of the module contract */ - async getSigner(): Promise { + async getSigner(): Promise { throw new Error("Method not implemented."); } @@ -252,37 +248,32 @@ export class SessionKeyManagerModule extends BaseValidationModule { * @remarks This is the dummy signature for the module, used in buildUserOp for bundler estimation * @returns Dummy signature */ - async getDummySignature(params?: ModuleInfo): Promise { - Logger.log("moduleInfo ", params); + async getDummySignature(params?: ModuleInfo): Promise { if (!params) { throw new Error("Session signer is not provided."); } const sessionSignerData = await this.getLeafInfo(params); - const leafDataHex = hexConcat([ - hexZeroPad(ethers.utils.hexlify(sessionSignerData.validUntil), 6), - hexZeroPad(ethers.utils.hexlify(sessionSignerData.validAfter), 6), - hexZeroPad(sessionSignerData.sessionValidationModule, 20), + const leafDataHex = concat([ + pad(toHex(sessionSignerData.validUntil), { size: 6 }), + pad(toHex(sessionSignerData.validAfter), { size: 6 }), + pad(sessionSignerData.sessionValidationModule, { size: 20 }), sessionSignerData.sessionKeyData, ]); // Generate the padded signature with (validUntil,validAfter,sessionVerificationModuleAddress,validationData,merkleProof,signature) - let paddedSignature = defaultAbiCoder.encode( - ["uint48", "uint48", "address", "bytes", "bytes32[]", "bytes"], - [ - sessionSignerData.validUntil, - sessionSignerData.validAfter, - sessionSignerData.sessionValidationModule, - sessionSignerData.sessionKeyData, - this.merkleTree.getHexProof(ethers.utils.keccak256(leafDataHex) as unknown as Buffer), - this.mockEcdsaSessionKeySig, - ], - ); - + let paddedSignature: Hex = encodeAbiParameters(parseAbiParameters("uint48, uint48, address, bytes, bytes32[], bytes"), [ + sessionSignerData.validUntil, + sessionSignerData.validAfter, + sessionSignerData.sessionValidationModule, + sessionSignerData.sessionKeyData, + this.merkleTree.getHexProof(keccak256(leafDataHex)) as Hex[], + this.mockEcdsaSessionKeySig, + ]); if (params?.additionalSessionData) { paddedSignature += params.additionalSessionData; } - const dummySig = ethers.utils.defaultAbiCoder.encode(["bytes", "address"], [paddedSignature, this.getAddress()]); + const dummySig = encodeAbiParameters(parseAbiParameters(["bytes, address"]), [paddedSignature as Hex, this.getAddress()]); return dummySig; } @@ -290,15 +281,14 @@ export class SessionKeyManagerModule extends BaseValidationModule { /** * @remarks Other modules may need additional attributes to build init data */ - async getInitData(): Promise { + async getInitData(): Promise { throw new Error("Method not implemented."); } /** * @remarks This Module dont have knowledge of signer. So, this method is not implemented */ - async signMessage(message: Bytes | string): Promise { - Logger.log("message", message); + async signMessage(_message: Uint8Array | string): Promise { throw new Error("Method not implemented."); } } diff --git a/packages/modules/src/index.ts b/packages/modules/src/index.ts index f51916377..ca954778b 100644 --- a/packages/modules/src/index.ts +++ b/packages/modules/src/index.ts @@ -1,11 +1,26 @@ -export * from "./utils/Types"; -export * from "./utils/Constants"; -export * from "./interfaces/IValidationModule"; -export * from "./interfaces/ISessionValidationModule"; -export * from "./BaseValidationModule"; -export * from "./ECDSAOwnershipValidationModule"; -export * from "./MultichainValidationModule"; -export * from "./SessionKeyManagerModule"; -export * from "./BatchedSessionRouterModule"; -export * from "./session-validation-modules/ERC20SessionValidationModule"; +export * from "./utils/Types.js"; +export * from "./utils/Constants.js"; +export * from "./interfaces/IValidationModule.js"; +export * from "./interfaces/ISessionValidationModule.js"; +export * from "./BaseValidationModule.js"; +export * from "./ECDSAOwnershipValidationModule.js"; +export * from "./MultichainValidationModule.js"; +export * from "./SessionKeyManagerModule.js"; +export * from "./BatchedSessionRouterModule.js"; +export * from "./session-validation-modules/ERC20SessionValidationModule.js"; + +import { + BatchedSessionRouterModule, + ECDSAOwnershipValidationModule, + MultiChainValidationModule, + SessionKeyManagerModule, + ERC20SessionValidationModule, +} from "./index.js"; + +export const createBatchedSessionRouterModule = BatchedSessionRouterModule.create; +export const createMultiChainValidationModule = MultiChainValidationModule.create; +export const createECDSAOwnershipValidationModule = ECDSAOwnershipValidationModule.create; +export const createSessionKeyManagerModule = SessionKeyManagerModule.create; +export const createERC20SessionValidationModule = ERC20SessionValidationModule.create; + // export * from './PasskeyValidationModule' diff --git a/packages/modules/src/interfaces/ISessionStorage.ts b/packages/modules/src/interfaces/ISessionStorage.ts index eb1fb1078..da2f8e13e 100644 --- a/packages/modules/src/interfaces/ISessionStorage.ts +++ b/packages/modules/src/interfaces/ISessionStorage.ts @@ -1,21 +1,23 @@ -import { Wallet, Signer } from "ethers"; +import { Hex } from "viem"; +import { SmartAccountSigner } from "@alchemy/aa-core"; +import { SignerData } from "../utils/Types"; export type SessionStatus = "PENDING" | "ACTIVE" | "INACTIVE" | "EXPIRED"; export type SessionLeafNode = { validUntil: number; validAfter: number; - sessionValidationModule: string; - sessionKeyData: string; - sessionPublicKey: string; + sessionValidationModule: Hex; + sessionKeyData: Hex; + sessionPublicKey: Hex; sessionID?: string; status: SessionStatus; }; export type SessionSearchParam = { sessionID?: string; - sessionPublicKey?: string; - sessionValidationModule?: string; + sessionPublicKey?: Hex; + sessionValidationModule?: Hex; status?: SessionStatus; }; @@ -49,19 +51,19 @@ export interface ISessionStorage { * If no signer object is passed, it'll create a random signer and add it to the session storage * @param signer Optional signer to be added to the session storage */ - addSigner(_signer?: Wallet): Promise; + addSigner(_signer?: SignerData): Promise; /** * Fetch a signer from the session storage * @param signerPublicKey Public key of the signer to be fetched */ - getSignerByKey(_signerPublicKey: string): Promise; + getSignerByKey(_signerPublicKey: string): Promise; /** * Fetch a signer from the session storage based on the session search param * @param param SessionSearchParam to be used to fetch the signer */ - getSignerBySession(_param: SessionSearchParam): Promise; + getSignerBySession(_param: SessionSearchParam): Promise; /** * Fetch all the session leaf nodes from the session storage based on the session search param. diff --git a/packages/modules/src/interfaces/IValidationModule.ts b/packages/modules/src/interfaces/IValidationModule.ts index 4b8269674..ee3da28a9 100644 --- a/packages/modules/src/interfaces/IValidationModule.ts +++ b/packages/modules/src/interfaces/IValidationModule.ts @@ -1,12 +1,11 @@ -import { WalletClientSigner } from "@alchemy/aa-core"; -import { Signer } from "ethers"; -import { Bytes } from "ethers/lib/utils"; +import { SmartAccountSigner } from "@alchemy/aa-core"; +import { Hex } from "viem"; export interface IValidationModule { - getAddress(): string; - getInitData(): Promise; - getSigner(): Promise; - signUserOpHash(_userOpHash: string): Promise; - signMessage(_message: Bytes | string): Promise; - getDummySignature(): Promise; + getAddress(): Hex; + getInitData(): Promise; + getSigner(): Promise; + signUserOpHash(_userOpHash: string): Promise; + signMessage(_message: string | Uint8Array): Promise; + getDummySignature(): Promise; } diff --git a/packages/modules/src/session-storage/SessionLocalStorage.ts b/packages/modules/src/session-storage/SessionLocalStorage.ts index 3f9ada1c4..28f3133a6 100644 --- a/packages/modules/src/session-storage/SessionLocalStorage.ts +++ b/packages/modules/src/session-storage/SessionLocalStorage.ts @@ -1,5 +1,9 @@ -import { Wallet, Signer } from "ethers"; -import { ISessionStorage, SessionLeafNode, SessionSearchParam, SessionStatus } from "../interfaces/ISessionStorage"; +import { Hex, createWalletClient, http, toHex } from "viem"; +import { SmartAccountSigner, WalletClientSigner } from "@alchemy/aa-core"; +import { ISessionStorage, SessionLeafNode, SessionSearchParam, SessionStatus } from "../interfaces/ISessionStorage.js"; +import { mainnet } from "viem/chains"; +import { generatePrivateKey, privateKeyToAccount } from "viem/accounts"; +import { SignerData } from "../utils/Types"; export class SessionLocalStorage implements ISessionStorage { private smartAccountAddress: string; @@ -19,11 +23,13 @@ export class SessionLocalStorage implements ISessionStorage { } private getSessionStore(): any { + // @ts-ignore: LocalStorage is not available in node const data = localStorage.getItem(this.getStorageKey("sessions")); return data ? JSON.parse(data) : { merkleRoot: "", leafNodes: [] }; } private getSignerStore(): any { + // @ts-ignore: LocalStorage is not available in node const data = localStorage.getItem(this.getStorageKey("signers")); return data ? JSON.parse(data) : {}; } @@ -38,9 +44,10 @@ export class SessionLocalStorage implements ISessionStorage { async addSessionData(leaf: SessionLeafNode): Promise { const data = this.getSessionStore(); - leaf.sessionValidationModule = this.toLowercaseAddress(leaf.sessionValidationModule); - leaf.sessionPublicKey = this.toLowercaseAddress(leaf.sessionPublicKey); + leaf.sessionValidationModule = this.toLowercaseAddress(leaf.sessionValidationModule) as Hex; + leaf.sessionPublicKey = this.toLowercaseAddress(leaf.sessionPublicKey) as Hex; data.leafNodes.push(leaf); + // @ts-ignore: LocalStorage is not available in node localStorage.setItem(this.getStorageKey("sessions"), JSON.stringify(data)); } @@ -90,39 +97,62 @@ export class SessionLocalStorage implements ISessionStorage { } session.status = status; + // @ts-ignore: LocalStorage is not available in node localStorage.setItem(this.getStorageKey("sessions"), JSON.stringify(data)); } async clearPendingSessions(): Promise { const data = this.getSessionStore(); data.leafNodes = data.leafNodes.filter((s: SessionLeafNode) => s.status !== "PENDING"); + // @ts-ignore: LocalStorage is not available in node localStorage.setItem(this.getStorageKey("sessions"), JSON.stringify(data)); } - async addSigner(signer?: Wallet): Promise { + async addSigner(signerData: SignerData): Promise { const signers = this.getSignerStore(); - if (!signer) { - signer = Wallet.createRandom(); + let signer: SignerData; + if (!signerData) { + const pkey = generatePrivateKey(); + signer = { + pvKey: pkey, + pbKey: privateKeyToAccount(pkey).publicKey, + }; + } else { + signer = signerData; } - signers[this.toLowercaseAddress(signer.publicKey)] = { - privateKey: signer.privateKey, - publicKey: signer.publicKey, - }; + const accountSigner = privateKeyToAccount(toHex(signer.pvKey)); + const client = createWalletClient({ + account: accountSigner, + chain: signerData.chainId, + transport: http(), + }); + const walletClientSigner = new WalletClientSigner( + client, + "json-rpc", // signerType + ); + signers[this.toLowercaseAddress(accountSigner.address)] = signerData; + // @ts-ignore: LocalStorage is not available in node localStorage.setItem(this.getStorageKey("signers"), JSON.stringify(signers)); - return signer; + return walletClientSigner; } - async getSignerByKey(sessionPublicKey: string): Promise { + async getSignerByKey(sessionPublicKey: string): Promise { const signers = this.getSignerStore(); const signerData = signers[this.toLowercaseAddress(sessionPublicKey)]; if (!signerData) { throw new Error("Signer not found."); } - const signer = new Wallet(signerData.privateKey); + const account = privateKeyToAccount(signerData.privateKey); + const client = createWalletClient({ + account, + chain: mainnet, + transport: http(), + }); + const signer = new WalletClientSigner(client, "viem"); return signer; } - async getSignerBySession(param: SessionSearchParam): Promise { + async getSignerBySession(param: SessionSearchParam): Promise { const session = await this.getSessionData(param); return this.getSignerByKey(session.sessionPublicKey); } @@ -142,6 +172,7 @@ export class SessionLocalStorage implements ISessionStorage { setMerkleRoot(merkleRoot: string): Promise { const data = this.getSessionStore(); data.merkleRoot = merkleRoot; + // @ts-ignore: LocalStorage is not available in node localStorage.setItem(this.getStorageKey("sessions"), JSON.stringify(data)); return Promise.resolve(); } diff --git a/packages/modules/src/session-validation-modules/ERC20SessionValidationModule.ts b/packages/modules/src/session-validation-modules/ERC20SessionValidationModule.ts index 4a9f416ee..131746a38 100644 --- a/packages/modules/src/session-validation-modules/ERC20SessionValidationModule.ts +++ b/packages/modules/src/session-validation-modules/ERC20SessionValidationModule.ts @@ -1,6 +1,6 @@ -import { defaultAbiCoder } from "ethers/lib/utils"; -import { ISessionValidationModule } from "../interfaces/ISessionValidationModule"; +import { ISessionValidationModule } from "../interfaces/ISessionValidationModule.js"; import { ERC20SessionKeyData, SessionValidationModuleConfig } from "../utils/Types"; +import { encodeAbiParameters, parseAbiParameters } from "viem"; /** * Session validation module for ERC20 token transfers. @@ -37,10 +37,12 @@ export class ERC20SessionValidationModule implements ISessionValidationModule { this._validateSessionKeyData(sessionData); - const sessionKeyData = defaultAbiCoder.encode( - ["address", "address", "address", "uint256"], - [sessionData.sessionKey, sessionData.token, sessionData.recipient, sessionData.maxAmount], - ); + const sessionKeyData = encodeAbiParameters(parseAbiParameters("address, address, address, uint256"), [ + sessionData.sessionKey, + sessionData.token, + sessionData.recipient, + sessionData.maxAmount, + ]); return sessionKeyData; } diff --git a/packages/modules/src/utils/Constants.ts b/packages/modules/src/utils/Constants.ts index cab7efbef..407e374d0 100644 --- a/packages/modules/src/utils/Constants.ts +++ b/packages/modules/src/utils/Constants.ts @@ -1,4 +1,4 @@ -import { ModuleVersion } from "./Types"; +import { ModuleVersion } from "./Types.js"; export const DEFAULT_MODULE_VERSION: ModuleVersion = "V1_0_0"; diff --git a/packages/modules/src/utils/Helper.ts b/packages/modules/src/utils/Helper.ts new file mode 100644 index 000000000..0754a9f30 --- /dev/null +++ b/packages/modules/src/utils/Helper.ts @@ -0,0 +1,41 @@ +import { UserOperationStruct } from "@alchemy/aa-core"; +import { Hex, encodeAbiParameters, keccak256, parseAbiParameters } from "viem"; + +function packUserOp(op: Partial, forSignature = true): string { + if (!op.initCode || !op.callData || !op.paymasterAndData) throw new Error("Missing userOp properties"); + if (forSignature) { + return encodeAbiParameters(parseAbiParameters("address, uint256, bytes32, bytes32, uint256, uint256, uint256, uint256, uint256, bytes32"), [ + op.sender as Hex, + BigInt(op.nonce as Hex), + keccak256(op.initCode as Hex), + keccak256(op.callData as Hex), + BigInt(op.callGasLimit as Hex), + BigInt(op.verificationGasLimit as Hex), + BigInt(op.preVerificationGas as Hex), + BigInt(op.maxFeePerGas as Hex), + BigInt(op.maxPriorityFeePerGas as Hex), + keccak256(op.paymasterAndData as Hex), + ]); + } else { + // for the purpose of calculating gas cost encode also signature (and no keccak of bytes) + return encodeAbiParameters(parseAbiParameters("address, uint256, bytes, bytes, uint256, uint256, uint256, uint256, uint256, bytes, bytes"), [ + op.sender as Hex, + BigInt(op.nonce as Hex), + op.initCode as Hex, + op.callData as Hex, + BigInt(op.callGasLimit as Hex), + BigInt(op.verificationGasLimit as Hex), + BigInt(op.preVerificationGas as Hex), + BigInt(op.maxFeePerGas as Hex), + BigInt(op.maxPriorityFeePerGas as Hex), + op.paymasterAndData as Hex, + op.signature as Hex, + ]); + } +} + +export const getUserOpHash = (userOp: Partial, entryPointAddress: Hex, chainId: number): Hex => { + const userOpHash = keccak256(packUserOp(userOp, true) as Hex); + const enc = encodeAbiParameters(parseAbiParameters("bytes32, address, uint256"), [userOpHash, entryPointAddress, BigInt(chainId)]); + return keccak256(enc); +}; diff --git a/packages/modules/src/utils/Types.ts b/packages/modules/src/utils/Types.ts index 267de2d3a..b4b96a2c7 100644 --- a/packages/modules/src/utils/Types.ts +++ b/packages/modules/src/utils/Types.ts @@ -1,23 +1,28 @@ -import { ChainId, UserOperation } from "@biconomy/core-types"; -import { Signer } from "ethers"; +import { Chain, Hex } from "viem"; +import { UserOperationStruct, SmartAccountSigner } from "@alchemy/aa-core"; import { SessionKeyManagerModule } from "../SessionKeyManagerModule"; -import { ISessionStorage } from "../interfaces/ISessionStorage"; -import { WalletClientSigner } from "@alchemy/aa-core"; - +import { ISessionStorage } from "../interfaces/ISessionStorage.js"; +import { SupportedSigner } from "@biconomy/common"; export type ModuleVersion = "V1_0_0"; // | 'V1_0_1' export interface BaseValidationModuleConfig { - entryPointAddress?: string; + entryPointAddress?: Hex; } export interface ECDSAOwnershipValidationModuleConfig extends BaseValidationModuleConfig { - moduleAddress?: string; + moduleAddress?: Hex; version?: ModuleVersion; - signer: Signer | WalletClientSigner; + signer: SupportedSigner; +} + +export interface ECDSAOwnershipValidationModuleConfigConstructorProps extends BaseValidationModuleConfig { + moduleAddress?: Hex; + version?: ModuleVersion; + signer: SmartAccountSigner; } export interface SessionKeyManagerModuleConfig extends BaseValidationModuleConfig { - moduleAddress?: string; + moduleAddress?: Hex; version?: ModuleVersion; nodeClientUrl?: string; smartAccountAddress: string; @@ -26,19 +31,15 @@ export interface SessionKeyManagerModuleConfig extends BaseValidationModuleConfi } export interface BatchedSessionRouterModuleConfig extends BaseValidationModuleConfig { - moduleAddress?: string; + moduleAddress?: Hex; version?: ModuleVersion; sessionKeyManagerModule?: SessionKeyManagerModule; // could be BaseValidationModule - sessionManagerModuleAddress?: string; + sessionManagerModuleAddress?: Hex; nodeClientUrl?: string; smartAccountAddress: string; storageType?: StorageType; - - // sessionSigner?: Signer - // sessionPubKey?: string - // nodeClientUrl?: string } export enum StorageType { @@ -47,8 +48,8 @@ export enum StorageType { export type SessionParams = { sessionID?: string; - sessionSigner: Signer; - sessionValidationModule?: string; + sessionSigner: SupportedSigner; + sessionValidationModule?: Hex; additionalSessionData?: string; }; @@ -56,8 +57,8 @@ export type ModuleInfo = { // Could be a full object of below params and that way it can be an array too! // sessionParams?: SessionParams[] // where SessionParams is below four sessionID?: string; - sessionSigner?: Signer; - sessionValidationModule?: string; + sessionSigner?: SupportedSigner; + sessionValidationModule?: Hex; additionalSessionData?: string; batchSessionParams?: SessionParams[]; }; @@ -68,6 +69,12 @@ export interface SendUserOpParams extends ModuleInfo { export type SimulationType = "validation" | "validation_and_execution"; +export type SignerData = { + pbKey: string; + pvKey: `0x${string}`; + chainId?: Chain; +}; + export type CreateSessionDataResponse = { data: string; sessionIDInfo: Array; @@ -76,33 +83,38 @@ export type CreateSessionDataResponse = { export interface CreateSessionDataParams { validUntil: number; validAfter: number; - sessionValidationModule: string; - sessionPublicKey: string; - sessionKeyData: string; + sessionValidationModule: Hex; + sessionPublicKey: Hex; + sessionKeyData: Hex; preferredSessionId?: string; } export interface MultiChainValidationModuleConfig extends BaseValidationModuleConfig { - moduleAddress?: string; + moduleAddress?: Hex; + version?: ModuleVersion; + signer: SupportedSigner; +} +export interface MultiChainValidationModuleConfigConstructorProps extends BaseValidationModuleConfig { + moduleAddress?: Hex; version?: ModuleVersion; - signer: Signer | WalletClientSigner; + signer: SmartAccountSigner; } export type MultiChainUserOpDto = { validUntil?: number; validAfter?: number; - chainId: ChainId; - userOp: Partial; + chainId: number; + userOp: Partial; }; export interface BaseSessionKeyData { - sessionKey: string; + sessionKey: Hex; } export interface ERC20SessionKeyData extends BaseSessionKeyData { - token: string; - recipient: string; - maxAmount: string; + token: Hex; + recipient: Hex; + maxAmount: bigint; } export interface SessionValidationModuleConfig { diff --git a/packages/modules/tests/modules.spec.ts b/packages/modules/tests/modules.spec.ts new file mode 100644 index 000000000..9785b2d2d --- /dev/null +++ b/packages/modules/tests/modules.spec.ts @@ -0,0 +1,45 @@ +import { TestData } from "../../../tests"; +import { createSmartAccountClient } from "@biconomy/account"; +import { createECDSAOwnershipValidationModule, createMultiChainValidationModule } from "../src"; + +describe("Account Tests", () => { + let ganache: TestData; + + beforeEach(() => { + // @ts-ignore: Comes from setup-unit-tests + [ganache] = testDataPerChain; + }); + + it("should create a MultiChainValidationModule from an ethers signer using convertSigner", async () => { + const { + bundlerUrl, + whale: { ethersSigner: signer }, + } = ganache; + + const defaultValidationModule = await createMultiChainValidationModule({ signer }); + // Should not require a signer or chainId + const smartAccount = await createSmartAccountClient({ bundlerUrl, defaultValidationModule }); + const address = await smartAccount.getAccountAddress(); + expect(address).toBeTruthy(); + // expect the relevant module to be set + expect(smartAccount.activeValidationModule).toEqual(defaultValidationModule); + }); + + it("should create a ECDSAOwnershipValidationModule from a viem signer using convertSigner", async () => { + const { + bundlerUrl, + whale: { viemWallet: signer }, + } = ganache; + + const defaultValidationModule = await createECDSAOwnershipValidationModule({ signer }); + // Should not require a signer or chainId + const smartAccount = await createSmartAccountClient({ + bundlerUrl, + defaultValidationModule, + }); + const address = await smartAccount.getAccountAddress(); + expect(address).toBeTruthy(); + // expect the relevant module to be set + expect(smartAccount.activeValidationModule).toEqual(defaultValidationModule); + }); +}); diff --git a/packages/modules/tests/multiChainValidationModule.e2e.spec.ts b/packages/modules/tests/multiChainValidationModule.e2e.spec.ts new file mode 100644 index 000000000..5871102f1 --- /dev/null +++ b/packages/modules/tests/multiChainValidationModule.e2e.spec.ts @@ -0,0 +1,92 @@ +import { PaymasterMode } from "@biconomy/paymaster"; +import { TestData } from "../../../tests"; +import { createSmartAccountClient } from "../../account/src/index"; +import { Hex, encodeFunctionData, parseAbi } from "viem"; +import { DEFAULT_MULTICHAIN_MODULE, MultiChainValidationModule } from "@biconomy/modules"; + +describe("Account with MultiChainValidation Module Tests", () => { + let mumbai: TestData; + let baseSepolia: TestData; + + beforeEach(() => { + // @ts-ignore: Comes from setup-e2e-tests + [mumbai, baseSepolia] = testDataPerChain; + }); + + it("Should mint an NFT gasless on baseSepolia and mumbai", async () => { + const { + whale: { alchemyWalletClientSigner: signerMumbai, publicAddress: recipientForBothChains }, + biconomyPaymasterApiKey: biconomyPaymasterApiKeyMumbai, + bundlerUrl: bundlerUrlMumbai, + chainId: chainIdMumbai, + } = mumbai; + + const { + whale: { alchemyWalletClientSigner: signerBase }, + biconomyPaymasterApiKey: biconomyPaymasterApiKeyBase, + bundlerUrl: bundlerUrlBase, + chainId: chainIdBase, + } = baseSepolia; + + const nftAddress: Hex = "0x1758f42Af7026fBbB559Dc60EcE0De3ef81f665e"; + + const multiChainModule = await MultiChainValidationModule.create({ + signer: signerMumbai, + moduleAddress: DEFAULT_MULTICHAIN_MODULE, + }); + + const [polygonAccount, baseAccount] = await Promise.all([ + createSmartAccountClient({ + chainId: chainIdMumbai, + signer: signerMumbai, + bundlerUrl: bundlerUrlMumbai, + defaultValidationModule: multiChainModule, + activeValidationModule: multiChainModule, + biconomyPaymasterApiKey: biconomyPaymasterApiKeyMumbai, + }), + createSmartAccountClient({ + chainId: chainIdBase, + signer: signerBase, + bundlerUrl: bundlerUrlBase, + defaultValidationModule: multiChainModule, + activeValidationModule: multiChainModule, + biconomyPaymasterApiKey: biconomyPaymasterApiKeyBase, + }), + ]); + + const encodedCall = encodeFunctionData({ + abi: parseAbi(["function safeMint(address owner) view returns (uint balance)"]), + functionName: "safeMint", + args: [recipientForBothChains], + }); + + const transaction = { + to: nftAddress, + data: encodedCall, + }; + + const [partialUserOp1, partialUserOp2] = await Promise.all([ + baseAccount.buildUserOp([transaction], { paymasterServiceData: { mode: PaymasterMode.SPONSORED } }), + polygonAccount.buildUserOp([transaction], { paymasterServiceData: { mode: PaymasterMode.SPONSORED } }), + ]); + + expect(partialUserOp1.paymasterAndData).not.toBe("0x"); + expect(partialUserOp2.paymasterAndData).not.toBe("0x"); + + // Sign the user ops using multiChainModule + const returnedOps = await multiChainModule.signUserOps([ + { userOp: partialUserOp1, chainId: chainIdBase }, + { userOp: partialUserOp2, chainId: chainIdMumbai }, + ]); + + // Send the signed user ops on both chains + const userOpResponse1 = await baseAccount.sendSignedUserOp(returnedOps[0] as any); + const userOpResponse2 = await polygonAccount.sendSignedUserOp(returnedOps[1] as any); + + console.log(userOpResponse1.userOpHash, "MULTICHAIN BASE USER OP HASH"); + console.log(userOpResponse2.userOpHash, "MULTICHAIN POLYGON USER OP HASH"); + + expect(userOpResponse1.userOpHash).toBeTruthy(); + expect(userOpResponse2.userOpHash).toBeTruthy(); + }, 30000); +}); diff --git a/packages/modules/tests/sessionValidationModule.e2e.spec.ts b/packages/modules/tests/sessionValidationModule.e2e.spec.ts new file mode 100644 index 000000000..87b139cf0 --- /dev/null +++ b/packages/modules/tests/sessionValidationModule.e2e.spec.ts @@ -0,0 +1,154 @@ +import { DEFAULT_SESSION_KEY_MANAGER_MODULE, createSessionKeyManagerModule } from "@biconomy/modules"; +import { SessionFileStorage } from "./utils/customSession"; +import { WalletClientSigner, createSmartAccountClient } from "../../account/src/index"; +import { Hex, encodeAbiParameters, encodeFunctionData, parseAbi, parseUnits } from "viem"; +import { TestData } from "../../../tests"; +import { checkBalance } from "../../../tests/utils"; +import { PaymasterMode } from "@biconomy/paymaster"; + +describe("Account Tests", () => { + let mumbai: TestData; + + beforeEach(() => { + // @ts-ignore: Comes from setup-e2e-tests + [mumbai] = testDataPerChain; + }); + + const sessionFileStorage: SessionFileStorage = new SessionFileStorage(DEFAULT_SESSION_KEY_MANAGER_MODULE); + + it("Should send a user op using Session Validation Module", async () => { + let sessionSigner: WalletClientSigner; + + const { + whale: { + account: { address: sessionKeyEOA }, + privateKey: pvKey, + }, + minnow: { publicAddress: recipient }, + publicClient, + chainId, + bundlerUrl, + biconomyPaymasterApiKey, + } = mumbai; + + try { + sessionSigner = await sessionFileStorage.getSignerByKey(sessionKeyEOA); + } catch (error) { + sessionSigner = await sessionFileStorage.addSigner({ pbKey: sessionKeyEOA, pvKey }); + } + + expect(sessionSigner).toBeTruthy(); + + // Create smart account + let smartAccount = await createSmartAccountClient({ + chainId, + signer: sessionSigner, + bundlerUrl, + biconomyPaymasterApiKey, + index: 1, // Increasing index to not conflict with other test cases and use a new smart account + }); + + // Create session module + const sessionModule = await createSessionKeyManagerModule({ + moduleAddress: DEFAULT_SESSION_KEY_MANAGER_MODULE, + smartAccountAddress: await smartAccount.getAddress(), + sessionStorageClient: sessionFileStorage, + }); + + // Set enabled call on session + const sessionKeyData = encodeAbiParameters( + [{ type: "address" }, { type: "address" }, { type: "address" }, { type: "uint256" }], + [ + sessionKeyEOA, + "0xdA5289fCAAF71d52a80A254da614a192b693e977", // erc20 token address + recipient, // receiver address + parseUnits("10", 6), + ], + ); + + const erc20ModuleAddr = "0x000000D50C68705bd6897B2d17c7de32FB519fDA"; + + const sessionTxData = await sessionModule.createSessionData([ + { + validUntil: 0, + validAfter: 0, + sessionValidationModule: erc20ModuleAddr, + sessionPublicKey: sessionKeyEOA, + sessionKeyData: sessionKeyData, + }, + ]); + + const setSessionAllowedTrx = { + to: DEFAULT_SESSION_KEY_MANAGER_MODULE, + data: sessionTxData.data, + }; + + const txArray: any = []; + + // Check if module is enabled + + const isEnabled = await smartAccount.isModuleEnabled(DEFAULT_SESSION_KEY_MANAGER_MODULE); + if (!isEnabled) { + const enableModuleTrx = await smartAccount.getEnableModuleData(DEFAULT_SESSION_KEY_MANAGER_MODULE); + txArray.push(enableModuleTrx); + txArray.push(setSessionAllowedTrx); + } else { + console.log("MODULE ALREADY ENABLED"); + txArray.push(setSessionAllowedTrx); + } + + const userOp = await smartAccount.buildUserOp(txArray); + + const userOpResponse1 = await smartAccount.sendUserOp(userOp); + const transactionDetails = await userOpResponse1.wait(); + console.log("Tx Hash: ", transactionDetails.receipt.transactionHash); + + const encodedCall = encodeFunctionData({ + abi: parseAbi(["function transfer(address _to, uint256 _value)"]), + functionName: "transfer", + args: [recipient, parseUnits("0.01", 6)], + }); + + const transferTx = { + to: "0xdA5289fCAAF71d52a80A254da614a192b693e977", //erc20 token address + data: encodedCall, + }; + + smartAccount = smartAccount.setActiveValidationModule(sessionModule); + + const maticBalanceBefore = await checkBalance(publicClient, await smartAccount.getAccountAddress()); + + const transferUserOp = await smartAccount.buildUserOp([transferTx], { + params: { + sessionSigner: sessionSigner, + sessionValidationModule: erc20ModuleAddr.toLowerCase() as Hex, + }, + paymasterServiceData: { + mode: PaymasterMode.SPONSORED, + }, + }); + + expect(transferUserOp.paymasterAndData).toBeDefined(); + expect(transferUserOp.paymasterAndData).not.toBeNull(); + expect(transferUserOp.paymasterAndData).not.toBe("0x"); + + const userOpResponse2 = await smartAccount.sendTransaction(transferTx, { + params: { + sessionSigner: sessionSigner, + sessionValidationModule: erc20ModuleAddr.toLowerCase() as Hex, + }, + paymasterServiceData: { + mode: PaymasterMode.SPONSORED, + }, + }); + + expect(userOpResponse2.userOpHash).toBeTruthy(); + expect(userOpResponse2.userOpHash).not.toBeNull(); + + const maticBalanceAfter = await checkBalance(publicClient, await smartAccount.getAccountAddress()); + + expect(maticBalanceAfter).toEqual(maticBalanceBefore); + + console.log(`Tx at: https://jiffyscan.xyz/userOpHash/${userOpResponse2.userOpHash}?network=mumbai`); + }, 60000); +}); diff --git a/packages/modules/tests/utils/customSession.ts b/packages/modules/tests/utils/customSession.ts new file mode 100644 index 000000000..002bcd2a5 --- /dev/null +++ b/packages/modules/tests/utils/customSession.ts @@ -0,0 +1,218 @@ +import * as fs from "fs"; +import { SmartAccountSigner, WalletClientSigner } from "@alchemy/aa-core"; +import { SignerData } from "@biconomy/modules/src"; +import { generatePrivateKey, privateKeyToAccount } from "viem/accounts"; +import { Hex, createWalletClient, http } from "viem"; +import { polygonMumbai } from "viem/chains"; +import { ISessionStorage, SessionLeafNode, SessionSearchParam, SessionStatus } from "@biconomy/modules/src/interfaces/ISessionStorage.js"; +import { Logger } from "@biconomy/common"; + +export class SessionFileStorage implements ISessionStorage { + private smartAccountAddress: string; + + constructor(smartAccountAddress: string) { + this.smartAccountAddress = smartAccountAddress.toLowerCase(); + } + + // This method reads data from the file and returns it in the JSON format + private async readDataFromFile(type: "sessions" | "signers"): Promise { + return new Promise((resolve) => { + fs.readFile(this.getStorageFilePath(type), "utf8", (err, data) => { + if (err) { + // Handle errors appropriately + resolve(undefined); + } else { + if (!data) { + resolve(null); + } else { + resolve(JSON.parse(data)); + } + // resolve(JSON.parse(data)); + } + }); + }); + } + + private getStorageFilePath(type: "sessions" | "signers"): string { + return `./packages/modules/tests/utils/sessionStorageData/${this.smartAccountAddress}_${type}.json`; + } + + private async writeDataToFile(data: any, type: "sessions" | "signers"): Promise { + return new Promise((resolve, reject) => { + const filePath = this.getStorageFilePath(type); + fs.writeFile(filePath, JSON.stringify(data), "utf8", (err) => { + if (err) { + // Handle errors appropriately + reject(err); + } else { + resolve(); + } + }); + }); + } + + private validateSearchParam(param: SessionSearchParam): void { + if (param.sessionID) { + return; + } else if (!param.sessionID && param.sessionPublicKey && param.sessionValidationModule) { + return; + } else { + throw new Error("Either pass sessionId or a combination of sessionPublicKey and sessionValidationModule address."); + } + } + + // Session store is in the form of mekrleRoot and leafnodes, each object will have a root and an array of leafNodes. + private async getSessionStore(): Promise { + // eslint-disable-next-line no-useless-catch + try { + const data = await this.readDataFromFile("sessions"); + return data || { merkleRoot: "", leafNodes: [] }; + } catch (error) { + // Handle errors appropriately + throw error; + } + } + + private async getSignerStore(): Promise { + // eslint-disable-next-line no-useless-catch + try { + const data = await this.readDataFromFile("signers"); + return data || {}; + } catch (error) { + // Handle errors appropriately + throw error; + } + } + + private getStorageKey(type: "sessions" | "signers"): string { + return `${this.smartAccountAddress}_${type}`; + } + + private toLowercaseAddress(address: string): Hex { + return address.toLowerCase() as Hex; + } + + async getSessionData(): Promise { + const sessions = (await this.getSessionStore()).leafNodes; + Logger.log("Got sessions", sessions); + const session = sessions[0]; + + if (!session) { + throw new Error("Session not found."); + } + return session; + } + + async addSessionData(leaf: SessionLeafNode): Promise { + Logger.log("Add session Data", leaf); + const data = await this.getSessionStore(); + leaf.sessionValidationModule = this.toLowercaseAddress(leaf.sessionValidationModule); + leaf.sessionPublicKey = this.toLowercaseAddress(leaf.sessionPublicKey); + data.leafNodes.push(leaf); + await this.writeDataToFile(data, "sessions"); // Use 'sessions' as the type + } + + async updateSessionStatus(param: SessionSearchParam, status: SessionStatus): Promise { + this.validateSearchParam(param); + + const data = await this.getSessionStore(); + const session = data.leafNodes.find((s: SessionLeafNode) => { + if (param.sessionID) { + return s.sessionID === param.sessionID; + } else if (param.sessionPublicKey && param.sessionValidationModule) { + return ( + s.sessionPublicKey === this.toLowercaseAddress(param.sessionPublicKey) && + s.sessionValidationModule === this.toLowercaseAddress(param.sessionValidationModule) + ); + } else { + return undefined; + } + }); + + if (!session) { + throw new Error("Session not found."); + } + + session.status = status; + await this.writeDataToFile(data, "sessions"); // Use 'sessions' as the type + } + + async clearPendingSessions(): Promise { + const data = await this.getSessionStore(); + data.leafNodes = data.leafNodes.filter((s: SessionLeafNode) => s.status !== "PENDING"); + await this.writeDataToFile(data, "sessions"); // Use 'sessions' as the type + } + + async addSigner(signerData: SignerData): Promise { + const signers = await this.getSignerStore(); + let signer: SignerData; + if (!signerData) { + const pkey = generatePrivateKey(); + signer = { + pvKey: pkey, + pbKey: privateKeyToAccount(pkey).publicKey, + }; + } else { + signer = signerData; + } + const accountSigner = privateKeyToAccount(signer.pvKey); + const client = createWalletClient({ + account: accountSigner, + chain: signerData.chainId, + transport: http(polygonMumbai.rpcUrls.default.http[0]), + }); + const walletClientSigner: SmartAccountSigner = new WalletClientSigner( + client, + "json-rpc", // signerType + ); + signers[this.toLowercaseAddress(accountSigner.address)] = { + pvKey: signer.pvKey, + pbKey: signer.pbKey, + }; + await this.writeDataToFile(signers, "signers"); // Use 'signers' as the type + return walletClientSigner; + } + + async getSignerByKey(sessionPublicKey: string): Promise { + const signers = await this.getSignerStore(); + Logger.log("Got signers", signers); + + const signerData: SignerData = signers[this.toLowercaseAddress(sessionPublicKey)]; + if (!signerData) { + throw new Error("Signer not found."); + } + Logger.log(signerData.pvKey, "PVKEY"); + + const signer = privateKeyToAccount(signerData.pvKey); + const walletClient = createWalletClient({ + account: signer, + transport: http(polygonMumbai.rpcUrls.default.http[0]), + }); + return new WalletClientSigner(walletClient, "json-rpc"); + } + + async getSignerBySession(): Promise { + const session = await this.getSessionData(); + Logger.log("got session", session); + const walletClientSinger = await this.getSignerByKey(session.sessionPublicKey); + return walletClientSinger; + } + + async getAllSessionData(param?: SessionSearchParam): Promise { + const sessions = (await this.getSessionStore()).leafNodes; + if (!param || !param.status) { + return sessions; + } + return sessions.filter((s: SessionLeafNode) => s.status === param.status); + } + + async getMerkleRoot(): Promise { + return (await this.getSessionStore()).merkleRoot; + } + + async setMerkleRoot(merkleRoot: string): Promise { + const data = await this.getSessionStore(); + data.merkleRoot = merkleRoot; + await this.writeDataToFile(data, "sessions"); // Use 'sessions' as the type + } +} diff --git a/packages/modules/tests/utils/sessionStorageData/.gitkeep b/packages/modules/tests/utils/sessionStorageData/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/packages/modules/tsconfig.build.json b/packages/modules/tsconfig.build.json new file mode 100644 index 000000000..4ac8b8026 --- /dev/null +++ b/packages/modules/tsconfig.build.json @@ -0,0 +1,32 @@ +{ + "$schema": "https://json.schemastore.org/tsconfig", + "display": "Build", + "compilerOptions": { + "lib": ["es2022", "dom"], + "target": "es2021", + "types": ["node"], + "allowJs": false, + "skipLibCheck": true, + "esModuleInterop": true, + "allowSyntheticDefaultImports": true, + "strict": true, + "forceConsistentCasingInFileNames": true, + "module": "esnext", + "moduleResolution": "node", + "resolveJsonModule": true, + "isolatedModules": true, + "verbatimModuleSyntax": false, + "useDefineForClassFields": true, + "noFallthroughCasesInSwitch": true, + "noImplicitReturns": true, + "useUnknownInCatchVariables": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "declaration": true, + "inlineSources": true, + "noEmit": false, + "sourceMap": true + }, + "exclude": ["**/*/node_modules", "**/*/tests", "tests"], + "include": ["src"] +} \ No newline at end of file diff --git a/packages/modules/tsconfig.json b/packages/modules/tsconfig.json index 0228bfe7a..adc19ded0 100644 --- a/packages/modules/tsconfig.json +++ b/packages/modules/tsconfig.json @@ -1,11 +1,13 @@ { - "extends": "../../tsconfig.settings.json", - "compilerOptions": { - "composite": true, - "outDir": "dist", - "baseUrl": "src", - "resolveJsonModule": true, - "esModuleInterop": true, - }, - "include": ["src", "src/**/*.json"] -} \ No newline at end of file + "extends": "../../tsconfig.settings.json", + "compilerOptions": { + "composite": true, + "outDir": "dist", + "baseUrl": "src", + "resolveJsonModule": true, + "esModuleInterop": true, + "lib": ["es2020"], + "types": ["node"], + }, + "include": ["src", "src/**/*.json"] +} diff --git a/packages/node-client/CHANGELOG.md b/packages/node-client/CHANGELOG.md deleted file mode 100644 index f5196ec43..000000000 --- a/packages/node-client/CHANGELOG.md +++ /dev/null @@ -1,73 +0,0 @@ -# Change Log - -All notable changes to this project will be documented in this file. -See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. - -## 3.1.3 (2023-12-28) - -VERSION Bump Only. - -## 3.1.2 (2023-12-28) - -VERSION Bump Only. - -## 3.1.1 (2023-11-09) -Version Bump Only. - - - - -## 3.1.0 (2023-09-20) -Version Bump Only. - -### Bug Fixes - -* backend contract address ([e81188d](https://github.com/bcnmy/biconomy-client-sdk/commit/e81188d454eb42ab581078d218d86571d724fa2d)) -* lint warning and errors ([2135498](https://github.com/bcnmy/biconomy-client-sdk/commit/2135498896beb54d25add820c1521ffa22d5db7c)) -* smart account response type ([f457f79](https://github.com/bcnmy/biconomy-client-sdk/commit/f457f794e27999ccc069c4afb7eb7644e224b61e)) - - - - - - - - - - -## 3.0.0 (2023-08-28) - - - - -## 3.0.0-alpha.0 (2023-07-12) - - - - - -## 2.0.1 (2023-05-18) - - -### Features - -* skipBundlerGasEstimation flag for gas ([487f3ae](https://github.com/bcnmy/biconomy-client-sdk/commit/487f3aefe21b2dd4fd46e18bef7168eae3c1ecc1)) - - - -## 2.0.0 (2023-04-07) - - -### Bug Fixes - -* backend contract address ([e81188d](https://github.com/bcnmy/biconomy-client-sdk/commit/e81188d454eb42ab581078d218d86571d724fa2d)) -* smart account response type ([f457f79](https://github.com/bcnmy/biconomy-client-sdk/commit/f457f794e27999ccc069c4afb7eb7644e224b61e)) - - - -## 1.0.0 (2023-01-03) - - -### Bug Fixes - -* smart account response type ([f457f79](https://github.com/bcnmy/biconomy-client-sdk/commit/f457f794e27999ccc069c4afb7eb7644e224b61e)) diff --git a/packages/node-client/README.md b/packages/node-client/README.md deleted file mode 100644 index b14934051..000000000 --- a/packages/node-client/README.md +++ /dev/null @@ -1,77 +0,0 @@ -# `@biconomy/node-client` - -# Biconomy SDK Node Client - -Node Client is the api client package that communicate with [Biconomy SDK](https://github.com/bcnmy/biconomy-client-sdk) backend node to fetch needed smart contract wallet data i.e supported chains list, transaction history, balances e.t.c - -## Installation - -`yarn add @biconomy/node-client` - -OR - -`npm install @biconomy/node-client ` - -## Usage - -``` -// import package -import NodeClient from '@biconomy/node-client' - -// initialisation - -const nodeClient = new NodeClient({ txServiceUrl: 'https://sdk-backend.staging.biconomy.io/v1' }) -``` - -# Fetch Supported Chains List - -``` -const supportedChainsList = await nodeClient.getAllSupportedChains() -console.log('supportedChainsList ', supportedChainsList) -``` - -# Fetch Transactions By Address - -``` -const chainId = 80001 -const address = '0xabc......' -const trxHistory = await nodeClient.getTransactionByAddress(chainId, address) -console.log('trxHistory ', trxHistory) -``` - -# Get Transaction By Hash - -``` -const txHash = '0x........' -const trxDetail = await nodeClient.getTransactionByHash(txHash) -console.log('trxDetail ', trxDetail) -``` - -# Get Smart Contract Wallet Balances - -``` -import { BalancesDto } from '@biconomy/node-client' - -import { ChainId } from '@biconomy/core-types' - -const address = '0xabc......' - -const balanceParams: BalancesDto = - { - // if no chainId is supplied, SDK will automatically pick active one that - // is being supplied for initialization - - chainId: ChainId.MAINNET, // chainId of your choice - address: address, - // If empty string you receive balances of all tokens watched by Indexer - // you can only whitelist token addresses that are listed in token respository - // specified above ^ - tokenAddresses: [], - }; - -const balFromSdk = await nodeClient.getAllTokenBalances(balanceParams); -console.info("balFromSdk ", balFromSdk); - -const usdBalFromSdk = await nodeClient.getTotalBalanceInUsd(balanceParams); -console.info("usdBalFromSdk ", usdBalFromSdk) -``` diff --git a/packages/node-client/package.json b/packages/node-client/package.json deleted file mode 100644 index df7bfc0d9..000000000 --- a/packages/node-client/package.json +++ /dev/null @@ -1,74 +0,0 @@ -{ - "name": "@biconomy/node-client", - "version": "3.1.3", - "description": "Node Client that comminucates with indexer service to fetch necessary details for the Smart Account", - "main": "./dist/src/index.js", - "typings": "./dist/src/index.d.ts", - "keywords": [ - "Ethereum", - "Gnosis", - "Biconomy", - "Backend Node" - ], - "scripts": { - "unbuild": "rimraf dist", - "build": "rimraf dist && tsc", - "format": "prettier --write \"{src,tests,e2e}/**/*.ts\"", - "lint": "tslint -p tsconfig.json", - "test": "jest tests/**/*.spec.ts --runInBand", - "test:file": "jest --config=../../jest.config.js --runInBand", - "test:concurrently": "concurrently -k --success first 'yarn start:ganache > /dev/null'", - "start:ganache": "ganache -m 'direct buyer cliff train rice spirit census refuse glare expire innocent quote'" - }, - "author": "Biconomy (https://biconomy.io)", - "license": "MIT", - "files": [ - "dist/*", - "README.md" - ], - "devDependencies": { - "@biconomy/core-types": "^3.1.0", - "@nomiclabs/hardhat-ethers": "^2.1.0", - "@nomiclabs/hardhat-waffle": "^2.0.3", - "@nomiclabs/hardhat-web3": "^2.0.0", - "@types/chai": "^4.3.0", - "@types/chai-as-promised": "^7.1.5", - "@types/node": "^17.0.23", - "@types/node-fetch": "^2.6.2", - "@typescript-eslint/eslint-plugin": "^5.17.0", - "@typescript-eslint/parser": "^5.17.0", - "chai": "^4.3.6", - "chai-as-promised": "^7.1.1", - "eslint": "^8.12.0", - "eslint-config-prettier": "^8.5.0", - "eslint-plugin-prettier": "^4.0.0", - "hardhat": "^2.9.2", - "husky": "^7.0.4", - "lint-staged": "^12.3.7", - "prettier": "^2.6.2", - "rimraf": "^3.0.2", - "ts-generator": "^0.1.1", - "ts-node": "^10.7.0", - "typescript": "^4.6.3" - }, - "lint-staged": { - "src/**/!(*test).ts": [ - "yarn lint", - "prettier --write" - ] - }, - "husky": { - "hooks": { - "pre-commit": "lint-staged" - } - }, - "publishConfig": { - "access": "public" - }, - "dependencies": { - "@biconomy/core-types": "^3.1.3", - "@ethersproject/abstract-signer": "^5.6.0", - "@nomiclabs/hardhat-ethers": "^2.1.0", - "node-fetch": "^2.6.6" - } -} diff --git a/packages/node-client/src/INodeClient.ts b/packages/node-client/src/INodeClient.ts deleted file mode 100644 index a36c8bc37..000000000 --- a/packages/node-client/src/INodeClient.ts +++ /dev/null @@ -1,93 +0,0 @@ -// import { FeeRefund, FeeRefundData, MetaTransactionData } from '@biconomy/core-types' -import { - SmartAccountByOwnerDto, - TokenByChainIdAndAddressDto, - TokenPriceResponse, - SupportedChainsResponse, - IndividualChainResponse, - SupportedTokensResponse, - IndividualTokenResponse, - SmartAccountsResponse, - BalancesResponse, - BalancesDto, - UsdBalanceResponse, - SCWTransactionResponse, - WhiteListSignatureResponse, -} from "./types/NodeClientTypes"; - -interface INodeClient { - // 1. Chain Apis - - /** - * Get all supported chains by backend node configuration - */ - getAllSupportedChains(): Promise; - - /** - * Get ChainConfig for requested chainId - * @param chainId - */ - getChainById(_chainId: number): Promise; - - // 2. Token APIs - - /** - * Get prices for configured tokens from backend node API - * @param chainId - */ - getTokenPricesByChainId(_chainId: number): Promise; - - /** - * Get all supported tokens - */ - getAllTokens(): Promise; - - /** - * Get TokenInfo for requested chainId - * @param chainId - */ - getTokensByChainId(_chainId: number): Promise; - - /** - * Get TokenInfo by address and chainId - * @param tokenByChainIdAndAddressDto - */ - getTokenByChainIdAndAddress(_tokenByChainIdAndAddressDto: TokenByChainIdAndAddressDto): Promise; - - // 3. Smart Account Endpoints - - /** - * Get information of all smart accounts deployed for particular eoa owner for any version and index - * @param smartAccountByOwnerDto - */ - getSmartAccountsByOwner(_smartAccountByOwnerDto: SmartAccountByOwnerDto): Promise; - - // 4. Balances Endpoints - - /** - * Get token balances for requested chainId and address - * address could be EOA or SmartAccount - * @param balancesDto - */ - getAllTokenBalances(_balancesDto: BalancesDto): Promise; - - /** - * - * @param balancesDto Get total USD balance - */ - getTotalBalanceInUsd(_balancesDto: BalancesDto): Promise; - - /** - * - * @param origin - * About: Whitelist domain by passing the origin domain - * Purpose: Returns the signature used in init - */ - whitelistUrl(_origin: string): Promise; - - getTransactionByHash(_txHash: string): Promise; - - getTransactionByAddress(_chainId: number, _address: string): Promise; -} - -export default INodeClient; diff --git a/packages/node-client/src/NodeClient.ts b/packages/node-client/src/NodeClient.ts deleted file mode 100644 index a2df00662..000000000 --- a/packages/node-client/src/NodeClient.ts +++ /dev/null @@ -1,145 +0,0 @@ -import INodeClient from "./INodeClient"; -import { - SmartAccountByOwnerDto, - TokenByChainIdAndAddressDto, - TokenPriceResponse, - SupportedChainsResponse, - IndividualChainResponse, - SupportedTokensResponse, - IndividualTokenResponse, - SmartAccountsResponse, - BalancesDto, - BalancesResponse, - UsdBalanceResponse, - SCWTransactionResponse, - WhiteListSignatureResponse, -} from "./types/NodeClientTypes"; -import { getTxServiceBaseUrl } from "./utils"; -import { HttpMethod, sendRequest } from "./utils/HttpRequests"; -export interface NodeClientConfig { - /** txServiceUrl - Safe Transaction Service URL */ - txServiceUrl: string; -} - -class NodeClient implements INodeClient { - #txServiceBaseUrl: string; - - constructor({ txServiceUrl }: NodeClientConfig) { - this.#txServiceBaseUrl = getTxServiceBaseUrl(txServiceUrl); - } - - /** - * - * @returns The list of Network info - */ - async getAllSupportedChains(): Promise { - return sendRequest({ - url: `${this.#txServiceBaseUrl}/chains/`, - method: HttpMethod.Get, - }); - } - - /** - * - * @param chainId - * @description thie function will return the chain detail base on supplied { chainId } - * @returns - */ - async getChainById(chainId: number): Promise { - return sendRequest({ - url: `${this.#txServiceBaseUrl}/chains/${chainId}`, - method: HttpMethod.Get, - }); - } - - /** - * - * @param chainId - * @description this function will return token price base on supplied {chainId} - * @returns - */ - async getTokenPricesByChainId(chainId: number): Promise { - return sendRequest({ - url: `${this.#txServiceBaseUrl}/chains/chainId/${chainId}/price`, - method: HttpMethod.Get, - }); - } - - async getAllTokens(): Promise { - return sendRequest({ - url: `${this.#txServiceBaseUrl}/tokens/`, - method: HttpMethod.Get, - }); - } - - async getTokensByChainId(chainId: number): Promise { - return sendRequest({ - url: `${this.#txServiceBaseUrl}/tokens/chainId/${chainId}`, - method: HttpMethod.Get, - }); - } - - async getTokenByChainIdAndAddress(tokenByChainIdAndAddressDto: TokenByChainIdAndAddressDto): Promise { - const { chainId, tokenAddress } = tokenByChainIdAndAddressDto; - return sendRequest({ - url: `${this.#txServiceBaseUrl}/tokens/chainId/${chainId}/address/${tokenAddress}`, - method: HttpMethod.Get, - }); - } - - async getSmartAccountsByOwner(smartAccountByOwnerDto: SmartAccountByOwnerDto): Promise { - const { chainId, owner, index } = smartAccountByOwnerDto; - return sendRequest({ - url: `${this.#txServiceBaseUrl}/smart-accounts/chainId/${chainId}/owner/${owner}/index/${index}`, - method: HttpMethod.Get, - }); - } - - async getAllTokenBalances(balancesDto: BalancesDto): Promise { - return sendRequest({ - url: `${this.#txServiceBaseUrl}/smart-accounts/balances`, - method: HttpMethod.Post, - body: balancesDto, - }); - } - - async getTotalBalanceInUsd(balancesDto: BalancesDto): Promise { - return sendRequest({ - url: `${this.#txServiceBaseUrl}/smart-accounts/balance`, - method: HttpMethod.Post, - body: balancesDto, - }); - } - - /** - * - * @param origin - * @description this function will return the signature for your domain - * @returns - */ - async whitelistUrl(origin: string): Promise { - return sendRequest({ - url: `${this.#txServiceBaseUrl}/whitelist`, - method: HttpMethod.Post, - body: { - origin, - }, - }); - } - - getTransactionByAddress(chainId: number, address: string): Promise { - return sendRequest({ - url: `${this.#txServiceBaseUrl}/transactions/chainId/${chainId}/address/${address}`, - method: HttpMethod.Get, - }); - } - - getTransactionByHash(txHash: string): Promise { - return sendRequest({ - url: `${this.#txServiceBaseUrl}/transactions/txHash/${txHash}`, - method: HttpMethod.Get, - }); - } -} - -export default NodeClient; diff --git a/packages/node-client/src/index.ts b/packages/node-client/src/index.ts deleted file mode 100644 index 708fd7c83..000000000 --- a/packages/node-client/src/index.ts +++ /dev/null @@ -1,5 +0,0 @@ -import NodeClient, { NodeClientConfig } from "./NodeClient"; - -export * from "./types/NodeClientTypes"; -export default NodeClient; -export { NodeClientConfig }; diff --git a/packages/node-client/src/types/NodeClientTypes.ts b/packages/node-client/src/types/NodeClientTypes.ts deleted file mode 100644 index c94937936..000000000 --- a/packages/node-client/src/types/NodeClientTypes.ts +++ /dev/null @@ -1,225 +0,0 @@ -import { ChainId, SmartAccountVersion } from "@biconomy/core-types"; -export type SmartAccountInfoResponse = { - readonly name: string; - readonly version: string; - readonly api_version: string; - readonly secure: boolean; - readonly settings: { - readonly AWS_CONFIGURED: boolean; - readonly AWS_S3_CUSTOM_DOMAIN: string; - readonly ETHEREUM_NODE_URL: string; - readonly ETHEREUM_TRACING_NODE_URL: string; - readonly ETH_INTERNAL_TXS_BLOCK_PROCESS_LIMIT: number; - readonly ETH_INTERNAL_NO_FILTER: boolean; - readonly ETH_REORG_BLOCKS: number; - readonly TOKENS_LOGO_BASE_URI: string; - readonly TOKENS_LOGO_EXTENSION: string; - }; -}; - -export type SCWTransactionResponse = { - symbol: string; - tokenAddress: string; - scwAddress: string; - txHash: string; - blockNumber: number; - payment: number; - gasLimit: number; - gasUsage: number; - gasPrice: number; - chainId: number; - fromAddress: string; - toAddress: string; - amount: number; - type: string; - txStatus: string; - createdAt: number; - updatedAt: number; -}; - -export type BalancesDto = { - chainId: number; - address: string; - tokenAddresses: string[]; -}; - -export type WhiteListSignatureResponse = { - code: number; - message: string; - data: string; -}; - -export type SmartAccountByOwnerDto = { - chainId: number; - owner: string; - index: number; -}; - -export type TokenByChainIdAndAddressDto = { - chainId: number; - tokenAddress: string; -}; - -export type ContractDetails = { - version: SmartAccountVersion; - - address: string; - - abi: string; -}; - -export type ChainConfig = { - chainId: ChainId; - name: string; - symbol: string; - isL2: boolean; - isMainnet: boolean; - description: string; - blockExplorerUriTemplate: BlockExplorerConfig; - ensRegistryAddress: string; - walletFactory: ContractDetails[]; - multiSend: ContractDetails[]; - multiSendCall: ContractDetails[]; - wallet: ContractDetails[]; // base wallet - entryPoint: ContractDetails[]; //should make this address var - fallBackHandler: ContractDetails[]; //should make this address var - fallBackGasTankAddress: string; - relayerURL: string; - providerUrl: string; - indexerUrl: string; - backendNodeUrl: string; - createdAt: Date; - updatedAt: Date; - token: TokenInfo; -}; - -export type MasterCopyResponse = { - address: string; - version: string; - deployer: string; - deployedBlockNumber: number; - lastIndexedBlockNumber: number; -}; - -export type SafeInfoResponse = { - readonly address: string; - readonly nonce: number; - readonly threshold: number; - readonly owners: string[]; - readonly masterCopy: string; - readonly modules: string[]; - readonly fallbackHandler: string; - readonly version: string; -}; - -export type BlockExplorerConfig = { - address: string; - txHash: string; - api: string; -}; - -export type TokenInfo = { - id: number; - name: string; - symbol: string; - blockChain: number; - ercType?: string; - decimals: number; - logoUri: string; - address: string; - isNativeToken: boolean; - isEnabled: boolean; - cmcId: number; //Verify - price: number; //Verify - createdAt: Date; - updatedAt: Date; -}; - -// Note: Applies for Account V1 -export type ISmartAccount = { - version: SmartAccountVersion; - smartAccountAddress: string; - isDeployed: boolean; - chainId: ChainId; - eoaAddress: string; - entryPointAddress: string; - handlerAddress: string; - index: number; - implementationAddress: string; - fallBackHandlerAddress: string; - owner: string; - factoryAddress: string; - createdAt: number; - updatedAt: number; -}; - -export type IBalances = { - contract_decimals: number; - contract_name: string; - contract_ticker_symbol: string; - contract_address: string; - supports_erc: string | null; - logo_url: string | null; - last_transferred_at: string | null; - type: string; - balance: number; - balance_24h: number; - quote_rate: number; - quote_rate_24h: number; - nft_data: string | null; -}; - -export type SupportedChainsResponse = { - message: string; - code: number; - data: ChainConfig[]; -}; - -export type IndividualChainResponse = { - message: string; - code: number; - data: ChainConfig; -}; - -export type TokenPriceResponse = { - price: number; -}; - -export type SupportedTokensResponse = { - message: string; - code: number; - data: TokenInfo[]; -}; - -export type IndividualTokenResponse = { - message: string; - code: number; - data: TokenInfo; -}; -export type SmartAccountsResponse = { - message: string; - code: number; - data: ISmartAccount[]; -}; -export type BalancesResponse = { - message: string; - code: number; - data: IBalances[]; -}; - -export type UsdBalanceResponse = { - message: string; - code: number; - data: { - totalBalance: number; - }; -}; - -export type EstimateGasResponse = { - message: string; - code: number; - data: { - gas: number; - txBaseGas?: number; - }; -}; diff --git a/packages/node-client/src/utils/index.ts b/packages/node-client/src/utils/index.ts deleted file mode 100644 index 94b8829fe..000000000 --- a/packages/node-client/src/utils/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -export function getTxServiceBaseUrl(txServiceUrl: string): string { - return `${txServiceUrl}`; -} diff --git a/packages/node-client/tests/node-client.spec.ts b/packages/node-client/tests/node-client.spec.ts deleted file mode 100644 index 90c46ea23..000000000 --- a/packages/node-client/tests/node-client.spec.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { Signer as AbstractSigner } from "ethers"; -import { Web3Provider } from "@ethersproject/providers"; -import NodeClient from "../dist/src"; - -type EthereumInstance = { - chainId?: number; - provider?: Web3Provider; - signer?: AbstractSigner; -}; - -describe("Node Client tests", function () { - let nodeClient: NodeClient; - let gasUsed: number; - - beforeAll(async () => { - nodeClient = new NodeClient({ txServiceUrl: "https://sdk-backend.staging.biconomy.io/v1" }); - }); - - describe("Gas Estimation Endpoints", () => { - it("Empty test to remove warning", () => {}); - }); -}); diff --git a/packages/node-client/tsconfig.json b/packages/node-client/tsconfig.json deleted file mode 100644 index c7ff8535e..000000000 --- a/packages/node-client/tsconfig.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "extends": "../../tsconfig.settings.json", - "compilerOptions": { - "composite": true, - "outDir": "dist", - "baseUrl": "src" - }, - "include": ["src"] -} diff --git a/packages/particle-auth/.esbuild.js b/packages/particle-auth/.esbuild.js new file mode 100644 index 000000000..ca355e346 --- /dev/null +++ b/packages/particle-auth/.esbuild.js @@ -0,0 +1,58 @@ +const esbuildPluginTsc = require("esbuild-plugin-tsc"); +const esbuild = require("esbuild"); +const { dependencies, peerDependencies = {} } = require("./package.json"); +const { Generator } = require("npm-dts"); + +const COMMON_SETTINGS = { + entryPoints: ["src/index.ts"], + minify: true, + bundle: true, + plugins: [esbuildPluginTsc({ force: true })], +}; + +const ESM_SETTINGS = { + ...COMMON_SETTINGS, + sourcemap: true, + outfile: "dist/esm/index.js", + platform: "browser", + target: "esnext", + format: "esm", + mainFields: ["browser", "module", "main"], +}; +const buildForESM = async () => await esbuild.build(ESM_SETTINGS); + +const CJS_SETTINGS = { + ...COMMON_SETTINGS, + format: "cjs", + sourcemap: false, + outfile: "dist/cjs/index.js", + platform: "node", +}; + +const watchForCJS = async () => { + let ctx = await esbuild.context(CJS_SETTINGS); + await ctx.watch(); + await ctx.serve({ servedir: "dist/src" }); + console.log("watching..."); +}; + +const buildForCJS = async () => await esbuild.build(CJS_SETTINGS); +const buildForTYP = async () => await new Generator({ entry: "src/index.ts", output: "dist/types/index.d.ts" }).generate(); + +(async () => { + const buildType = process.argv.slice(2)[0]; + const shouldWatch = process.argv.slice(3)[0] === "--watch"; + if (!buildType) { + console.log("No build type provided"); + process.exit(1); + } + console.log(`Building for ${buildType}`); + if (buildType === "ESM") { + await buildForESM(); + } else if (buildType === "CJS") { + console.log("watching? " + shouldWatch); + await (shouldWatch ? watchForCJS : buildForCJS)(); + } else if (buildType === "TYP") { + await buildForTYP(); + } +})(); diff --git a/packages/particle-auth/CHANGELOG.md b/packages/particle-auth/CHANGELOG.md index 706af8966..0b1ef187b 100644 --- a/packages/particle-auth/CHANGELOG.md +++ b/packages/particle-auth/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## 4.0.0 (2023-12-28) + +VERSION Bump Only. + ## 3.1.3 (2023-12-28) VERSION Bump Only. diff --git a/packages/particle-auth/package.json b/packages/particle-auth/package.json index af925f88a..335ac30a2 100644 --- a/packages/particle-auth/package.json +++ b/packages/particle-auth/package.json @@ -1,9 +1,19 @@ { "name": "@biconomy/particle-auth", - "version": "3.1.3", + "version": "4.0.0", "description": "Particle auth for Biconomy SDK", - "main": "./dist/src/index.js", - "typings": "./dist/src/index.d.ts", + "main": "./dist/cjs/index.js", + "module": "./dist/esm/index.js", + "types": "./dist/types/index.d.ts", + "typings": "./dist/types/index.d.ts", + "exports": { + ".": { + "import": "./dist/esm/index.js", + "types": "./dist/types/index.d.ts", + "default": "./dist/cjs/index.js" + }, + "./package.json": "./package.json" + }, "keywords": [ "legos", "batching", @@ -12,7 +22,7 @@ "particle", "particle-auth" ], - "author": "livingrockrises ", + "author": "Biconomy", "homepage": "https://github.com/bcnmy/biconomy-client-sdk#readme", "license": "MIT", "files": [ @@ -25,7 +35,16 @@ }, "scripts": { "unbuild": "rimraf dist *.tsbuildinfo", - "build": "rimraf dist && tsc", + "build:watch": "yarn build:tsc --watch", + "dist:minify": "esbuild ./dist/esm/**/*.js ./dist/esm/*.js --minify --outdir=./dist/esm --bundle=false --allow-overwrite", + "build": "yarn unbuild && yarn build:tsc", + "build:esbuild": "yarn build:esbuild:cjs && yarn build:esbuild:esm && yarn build:typ", + "build:tsc:cjs": "tsc --project tsconfig.build.json --module commonjs --outDir ./dist/cjs --removeComments --verbatimModuleSyntax false && echo > ./dist/cjs/package.json '{\"type\":\"commonjs\"}'", + "build:tsc:esm": "tsc --project tsconfig.build.json --module esnext --outDir ./dist/esm --removeComments && echo > ./dist/esm/package.json '{\"type\":\"module\"}'", + "build:esbuild:cjs": "node .esbuild.js CJS && echo > ./dist/cjs/package.json '{\"type\":\"commonjs\"}'", + "build:esbuild:esm": "node .esbuild.js ESM && echo > ./dist/esm/package.json '{\"type\":\"module\"}'", + "build:typ": "tsc --project tsconfig.build.json --module esnext --declarationDir ./dist/types --emitDeclarationOnly --declaration --declarationMap", + "build:tsc": "yarn build:tsc:cjs && yarn build:tsc:esm && yarn build:typ && yarn dist:minify", "format": "prettier --write \"{src,tests}/**/*.ts\"", "lint": "tslint -p tsconfig.json" }, @@ -39,5 +58,11 @@ "@particle-network/auth": "^1.2.1", "@particle-network/biconomy": "^1.0.0", "@particle-network/provider": "^1.2.0" + }, + "devDependencies": { + "@types/node": "^20.11.10", + "esbuild": "^0.19.11", + "esbuild-plugin-tsc": "^0.4.0", + "npm-dts": "^1.3.12" } } diff --git a/packages/particle-auth/tsconfig.build.json b/packages/particle-auth/tsconfig.build.json new file mode 100644 index 000000000..4ac8b8026 --- /dev/null +++ b/packages/particle-auth/tsconfig.build.json @@ -0,0 +1,32 @@ +{ + "$schema": "https://json.schemastore.org/tsconfig", + "display": "Build", + "compilerOptions": { + "lib": ["es2022", "dom"], + "target": "es2021", + "types": ["node"], + "allowJs": false, + "skipLibCheck": true, + "esModuleInterop": true, + "allowSyntheticDefaultImports": true, + "strict": true, + "forceConsistentCasingInFileNames": true, + "module": "esnext", + "moduleResolution": "node", + "resolveJsonModule": true, + "isolatedModules": true, + "verbatimModuleSyntax": false, + "useDefineForClassFields": true, + "noFallthroughCasesInSwitch": true, + "noImplicitReturns": true, + "useUnknownInCatchVariables": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "declaration": true, + "inlineSources": true, + "noEmit": false, + "sourceMap": true + }, + "exclude": ["**/*/node_modules", "**/*/tests", "tests"], + "include": ["src"] +} \ No newline at end of file diff --git a/packages/particle-auth/tsconfig.json b/packages/particle-auth/tsconfig.json index 3dc5293ed..cda17a184 100644 --- a/packages/particle-auth/tsconfig.json +++ b/packages/particle-auth/tsconfig.json @@ -5,7 +5,8 @@ "outDir": "dist", "baseUrl": "src", "resolveJsonModule": true, - "esModuleInterop": true + "esModuleInterop": true, + "lib": ["es2020"], }, "include": ["src", "src/**/*.json"] } diff --git a/packages/paymaster/.esbuild.js b/packages/paymaster/.esbuild.js new file mode 100644 index 000000000..ca355e346 --- /dev/null +++ b/packages/paymaster/.esbuild.js @@ -0,0 +1,58 @@ +const esbuildPluginTsc = require("esbuild-plugin-tsc"); +const esbuild = require("esbuild"); +const { dependencies, peerDependencies = {} } = require("./package.json"); +const { Generator } = require("npm-dts"); + +const COMMON_SETTINGS = { + entryPoints: ["src/index.ts"], + minify: true, + bundle: true, + plugins: [esbuildPluginTsc({ force: true })], +}; + +const ESM_SETTINGS = { + ...COMMON_SETTINGS, + sourcemap: true, + outfile: "dist/esm/index.js", + platform: "browser", + target: "esnext", + format: "esm", + mainFields: ["browser", "module", "main"], +}; +const buildForESM = async () => await esbuild.build(ESM_SETTINGS); + +const CJS_SETTINGS = { + ...COMMON_SETTINGS, + format: "cjs", + sourcemap: false, + outfile: "dist/cjs/index.js", + platform: "node", +}; + +const watchForCJS = async () => { + let ctx = await esbuild.context(CJS_SETTINGS); + await ctx.watch(); + await ctx.serve({ servedir: "dist/src" }); + console.log("watching..."); +}; + +const buildForCJS = async () => await esbuild.build(CJS_SETTINGS); +const buildForTYP = async () => await new Generator({ entry: "src/index.ts", output: "dist/types/index.d.ts" }).generate(); + +(async () => { + const buildType = process.argv.slice(2)[0]; + const shouldWatch = process.argv.slice(3)[0] === "--watch"; + if (!buildType) { + console.log("No build type provided"); + process.exit(1); + } + console.log(`Building for ${buildType}`); + if (buildType === "ESM") { + await buildForESM(); + } else if (buildType === "CJS") { + console.log("watching? " + shouldWatch); + await (shouldWatch ? watchForCJS : buildForCJS)(); + } else if (buildType === "TYP") { + await buildForTYP(); + } +})(); diff --git a/packages/paymaster/CHANGELOG.md b/packages/paymaster/CHANGELOG.md index 27767c9bf..abbc2cae6 100644 --- a/packages/paymaster/CHANGELOG.md +++ b/packages/paymaster/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## 4.0.0 (2023-07-02) + +Export createPaymaster alias for static Paymaster.create call + ## 3.1.3 (2023-12-28) VERSION Bump Only. @@ -13,52 +17,42 @@ VERSION Bump Only. ## 3.1.1 (2023-11-09) - ### Bug Fixes -* lint warning and errors ([2135498](https://github.com/bcnmy/biconomy-client-sdk/commit/2135498896beb54d25add820c1521ffa22d5db7c)) - - +- lint warning and errors ([2135498](https://github.com/bcnmy/biconomy-client-sdk/commit/2135498896beb54d25add820c1521ffa22d5db7c)) ## 3.1.0 (2023-09-20) -Version Bump Only. +Version Bump Only. ## 3.0.0 (2023-08-28) Modular SDK - consists stable version of below updates done in Alphas. - - ## 3.0.0-alpha.0 (2023-08-02) ### Features -* letting maxFee and maxPriority not be undefined([46b985c](https://github.com/bcnmy/biconomy-client-sdk/commit/46b985c75fd135f151c9ac4380a65438cccc6f39)) -* passing on paymasterAndData([ae267f1])(https://github.com/bcnmy/biconomy-client-sdk/commit/ae267f1a103f37856eb233a38db7063bfcc4cb45) -* handle undefined values([e53d4a7])(https://github.com/bcnmy/biconomy-client-sdk/commit/e53d4a78aded8c8802786173daf12b27d445d4a0) -* handling userOp null values([c89ac42])(https://github.com/bcnmy/biconomy-client-sdk/commit/c89ac42ae1d7fd985ef2396d925cc63ec5cf926b) -* using signature provided by userop([0c40641])(https://github.com/bcnmy/biconomy-client-sdk/commit/0c40641e4cd6133f7348bb3e3022f8ab78fe299b) - - +- letting maxFee and maxPriority not be undefined([46b985c](https://github.com/bcnmy/biconomy-client-sdk/commit/46b985c75fd135f151c9ac4380a65438cccc6f39)) +- passing on paymasterAndData([ae267f1])(https://github.com/bcnmy/biconomy-client-sdk/commit/ae267f1a103f37856eb233a38db7063bfcc4cb45) +- handle undefined values([e53d4a7])(https://github.com/bcnmy/biconomy-client-sdk/commit/e53d4a78aded8c8802786173daf12b27d445d4a0) +- handling userOp null values([c89ac42])(https://github.com/bcnmy/biconomy-client-sdk/commit/c89ac42ae1d7fd985ef2396d925cc63ec5cf926b) +- using signature provided by userop([0c40641])(https://github.com/bcnmy/biconomy-client-sdk/commit/0c40641e4cd6133f7348bb3e3022f8ab78fe299b) # 3.1.0-alpha.0 (2023-07-24) VERSION Bump Only. - ## 3.0.0-alpha.0 (2023-07-12) - ### Bug Fixes -* linting ([563befe](https://github.com/bcnmy/biconomy-client-sdk/commit/563befedcc37aee4c531e01809b47e559a33f526)) -* linting ([d2f5f1a](https://github.com/bcnmy/biconomy-client-sdk/commit/d2f5f1afadc2a561c4ef01c0821a25b9d7fe776e)) - +- linting ([563befe](https://github.com/bcnmy/biconomy-client-sdk/commit/563befedcc37aee4c531e01809b47e559a33f526)) +- linting ([d2f5f1a](https://github.com/bcnmy/biconomy-client-sdk/commit/d2f5f1afadc2a561c4ef01c0821a25b9d7fe776e)) ### Features -* covert gas limits to numbers for making pm service call ([b1fe96f](https://github.com/bcnmy/biconomy-client-sdk/commit/b1fe96f7a312ceaf7aa689939b7c69718c710dd1)) -* get fee quote or data method in biconomy paymaster ([47748a6](https://github.com/bcnmy/biconomy-client-sdk/commit/47748a6384c2b74e1d9be4d570554098e1ac02e7)) -* update responses to support calculateGasLimits flag + update interfaces ([55bbd38](https://github.com/bcnmy/biconomy-client-sdk/commit/55bbd38b4ef8acaf8da1d52e36846557b134aba4)) -* using hybrid paymaster interface ([5fc56a7](https://github.com/bcnmy/biconomy-client-sdk/commit/5fc56a7db2de4a3f4bb87cd4d75584e79010b206)) +- covert gas limits to numbers for making pm service call ([b1fe96f](https://github.com/bcnmy/biconomy-client-sdk/commit/b1fe96f7a312ceaf7aa689939b7c69718c710dd1)) +- get fee quote or data method in biconomy paymaster ([47748a6](https://github.com/bcnmy/biconomy-client-sdk/commit/47748a6384c2b74e1d9be4d570554098e1ac02e7)) +- update responses to support calculateGasLimits flag + update interfaces ([55bbd38](https://github.com/bcnmy/biconomy-client-sdk/commit/55bbd38b4ef8acaf8da1d52e36846557b134aba4)) +- using hybrid paymaster interface ([5fc56a7](https://github.com/bcnmy/biconomy-client-sdk/commit/5fc56a7db2de4a3f4bb87cd4d75584e79010b206)) diff --git a/packages/paymaster/Readme.md b/packages/paymaster/Readme.md index 8b91b80a7..562a790f6 100644 --- a/packages/paymaster/Readme.md +++ b/packages/paymaster/Readme.md @@ -22,11 +22,11 @@ yarn add @biconomy/paymaster ```typescript // This is how you create paymaster instance in your dapp's -import { IPaymaster, BiconomyPaymaster } from "@biconomy/paymaster"; +import { IPaymaster, createPaymaster } from "@biconomy/paymaster"; // Currently this package only exports Biconomy Paymaster which acts as a Hybrid paymaster for gas abstraction. You can sponsor user transactions but can also make users pay gas in supported ERC20 tokens. -const paymaster = new BiconomyPaymaster({ +const paymaster = await createPaymaster({ paymasterUrl: "", // you can get this value from biconomy dashboard. https://dashboard.biconomy.io }); ``` @@ -38,7 +38,7 @@ Following are the methods that can be called on paymaster instance ```typescript export interface IHybridPaymaster extends IPaymaster { getPaymasterAndData(userOp: Partial, paymasterServiceData?: T): Promise; - buildTokenApprovalTransaction(tokenPaymasterRequest: BiconomyTokenPaymasterRequest, provider: Provider): Promise; + buildTokenApprovalTransaction(tokenPaymasterRequest: BiconomyTokenPaymasterRequest): Promise; getPaymasterFeeQuotesOrData(userOp: Partial, paymasterServiceData: FeeQuotesOrDataDto): Promise; } ``` @@ -57,17 +57,17 @@ export interface IPaymaster { ### Below API methods can be used for Biconomy Hybrid paymaster -**getPaymasterAndData** +**[getPaymasterAndData](https://bcnmy.github.io/biconomy-client-sdk/classes/Paymaster.html#getPaymasterAndData)** This function accepts a **`Partial`** object that includes all properties of **`userOp`** except for the **`signature`** and **`paymasterAndData`** field. It returns **`paymasterAndData`** as part of the **`PaymasterAndDataResponse`** -**buildTokenApprovalTransaction** +**[buildTokenApprovalTransaction](https://bcnmy.github.io/biconomy-client-sdk/classes/Paymaster.html#buildTokenApprovalTransaction)** This function is specifically used for token paymaster sponsorship. The primary purpose of this function is to create an approve transaction for paymaster that gets batched with the rest of your transactions. Note: You don't need to call this function. It will automatically get called as part of the **`buildTokenPaymasterUserOp`** function call. -**getPaymasterFeeQuotesOrData** +**[getPaymasterFeeQuotesOrData](https://bcnmy.github.io/biconomy-client-sdk/classes/Paymaster.html#getPaymasterFeeQuotesOrData)** This function is used to fetch quote information or paymaster data based on provided userOperation and paymasterServiceData. If explicit mode is not provided it tries for sponsorship first and then falls back to serving fee quotes for supported/requested token/s diff --git a/packages/paymaster/package.json b/packages/paymaster/package.json index 2ffd27699..1348e71c1 100644 --- a/packages/paymaster/package.json +++ b/packages/paymaster/package.json @@ -1,9 +1,19 @@ { "name": "@biconomy/paymaster", - "version": "3.1.3", + "version": "4.0.0", "description": "Biconomy Paymaster to interact with Paymaster Services that interacts with ( veriying and token ) paymasters", - "main": "./dist/src/index.js", - "typings": "./dist/src/index.d.ts", + "main": "./dist/cjs/index.js", + "module": "./dist/esm/index.js", + "types": "./dist/types/index.d.ts", + "typings": "./dist/types/index.d.ts", + "exports": { + ".": { + "import": "./dist/esm/index.js", + "types": "./dist/types/index.d.ts", + "default": "./dist/cjs/index.js" + }, + "./package.json": "./package.json" + }, "keywords": [ "Ethereum", "Veriying Paymaster", @@ -15,15 +25,21 @@ ], "scripts": { "unbuild": "rimraf dist *.tsbuildinfo", - "build": "rimraf dist && tsc", + "build:watch": "yarn build:tsc --watch", + "dist:minify": "esbuild ./dist/esm/**/*.js ./dist/esm/*.js --minify --outdir=./dist/esm --bundle=false --allow-overwrite", + "build": "yarn unbuild && yarn build:tsc", + "build:esbuild": "yarn build:esbuild:cjs && yarn build:esbuild:esm && yarn build:typ", + "build:tsc:cjs": "tsc --project tsconfig.build.json --module commonjs --outDir ./dist/cjs --removeComments --verbatimModuleSyntax false && echo > ./dist/cjs/package.json '{\"type\":\"commonjs\"}'", + "build:tsc:esm": "tsc --project tsconfig.build.json --module esnext --outDir ./dist/esm --removeComments && echo > ./dist/esm/package.json '{\"type\":\"module\"}'", + "build:esbuild:cjs": "node .esbuild.js CJS && echo > ./dist/cjs/package.json '{\"type\":\"commonjs\"}'", + "build:esbuild:esm": "node .esbuild.js ESM && echo > ./dist/esm/package.json '{\"type\":\"module\"}'", + "build:typ": "tsc --project tsconfig.build.json --module esnext --declarationDir ./dist/types --emitDeclarationOnly --declaration --declarationMap", + "build:tsc": "yarn build:tsc:cjs && yarn build:tsc:esm && yarn build:typ && yarn dist:minify", "format": "prettier --write \"{src,tests}/**/*.ts\"", "lint": "tslint -p tsconfig.json", - "test": "jest tests/**/*.spec.ts --runInBand", - "test:file": "jest --config=../../jest.config.js --runInBand", - "test:concurrently": "concurrently -k --success first 'yarn start:ganache > /dev/null'", - "start:ganache": "ganache -m 'direct buyer cliff train rice spirit census refuse glare expire innocent quote'" + "test": "jest tests/**/*.spec.ts --runInBand" }, - "author": "talhamalik883 ", + "author": "Biconomy", "repository": { "type": "git", "url": "git+https://github.com/bcnmy/biconomy-client-sdk.git" @@ -37,10 +53,14 @@ "access": "public" }, "dependencies": { - "@biconomy/common": "^3.1.3", - "@biconomy/core-types": "^3.1.3", - "@ethersproject/abstract-provider": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "ethers": "^5.7.0" + "@alchemy/aa-core": "3.0.0-alpha.4", + "@biconomy/common": "4.0.0", + "viem": "^2.7.3" + }, + "devDependencies": { + "@types/node": "^20.11.10", + "esbuild": "^0.19.11", + "esbuild-plugin-tsc": "^0.4.0", + "npm-dts": "^1.3.12" } } diff --git a/packages/paymaster/src/BiconomyPaymaster.ts b/packages/paymaster/src/BiconomyPaymaster.ts index 1734e23e6..bfe04699c 100644 --- a/packages/paymaster/src/BiconomyPaymaster.ts +++ b/packages/paymaster/src/BiconomyPaymaster.ts @@ -1,7 +1,5 @@ -import { Logger, sendRequest, HttpMethod, getTimestampInSeconds } from "@biconomy/common"; -import { resolveProperties } from "@ethersproject/properties"; -import { UserOperation, Transaction } from "@biconomy/core-types"; -import { Provider } from "@ethersproject/abstract-provider"; +import { encodeFunctionData, parseAbi } from "viem"; +import type { BigNumberish, UserOperationStruct } from "@alchemy/aa-core"; import { PaymasterFeeQuote, PaymasterConfig, @@ -12,10 +10,13 @@ import { BiconomyTokenPaymasterRequest, PaymasterMode, PaymasterAndDataResponse, -} from "./utils/Types"; -import { BigNumberish, BigNumber, ethers } from "ethers"; -import { ERC20_ABI } from "./constants"; -import { IHybridPaymaster } from "./interfaces/IHybridPaymaster"; + Transaction, + Hex, +} from "./utils/Types.js"; +import { IHybridPaymaster } from "./interfaces/IHybridPaymaster.js"; +import { MAX_UINT256, ERC20_ABI, ADDRESS_ZERO } from "./utils/Constants.js"; +import { sendRequest, HttpMethod, Logger } from "@biconomy/common"; +import { getTimestampInSeconds } from "./utils/Helpers.js"; const defaultPaymasterConfig: PaymasterConfig = { paymasterUrl: "", @@ -40,29 +41,27 @@ export class BiconomyPaymaster implements IHybridPaymaster): Promise> { - userOp = await resolveProperties(userOp); - if (userOp.nonce !== null && userOp.nonce !== undefined) { - userOp.nonce = BigNumber.from(userOp.nonce).toHexString(); - } - if (userOp.callGasLimit !== null && userOp.callGasLimit !== undefined) { - userOp.callGasLimit = BigNumber.from(userOp.callGasLimit).toString(); - } - if (userOp.verificationGasLimit !== null && userOp.verificationGasLimit !== undefined) { - userOp.verificationGasLimit = BigNumber.from(userOp.verificationGasLimit).toString(); - } - if (userOp.preVerificationGas !== null && userOp.preVerificationGas !== undefined) { - userOp.preVerificationGas = BigNumber.from(userOp.preVerificationGas).toString(); - } - if (userOp.maxFeePerGas !== null && userOp.maxFeePerGas !== undefined) { - userOp.maxFeePerGas = BigNumber.from(userOp.maxFeePerGas).toString(); - } - if (userOp.maxPriorityFeePerGas !== null && userOp.maxPriorityFeePerGas !== undefined) { - userOp.maxPriorityFeePerGas = BigNumber.from(userOp.maxPriorityFeePerGas).toString(); + private async prepareUserOperation(userOp: Partial): Promise> { + const userOperation = { ...userOp }; + try { + const keys1: (keyof UserOperationStruct)[] = ["nonce", "maxFeePerGas", "maxPriorityFeePerGas"]; + for (const key of keys1) { + if (userOperation[key] && userOperation[key] !== "0x") { + userOperation[key] = ("0x" + BigInt(userOp[key] as BigNumberish).toString(16)) as `0x${string}`; + } + } + const keys2: (keyof UserOperationStruct)[] = ["callGasLimit", "verificationGasLimit", "preVerificationGas"]; + for (const key of keys2) { + if (userOperation[key] && userOperation[key] !== "0x") { + userOperation[key] = BigInt(userOp[key] as BigNumberish).toString() as `0x${string}`; + } + } + } catch (error) { + throw `Failed to transform user operation: ${error}`; } - userOp.signature = userOp.signature || "0x"; - userOp.paymasterAndData = userOp.paymasterAndData || "0x"; - return userOp; + userOperation.signature = userOp.signature || "0x"; + userOperation.paymasterAndData = userOp.paymasterAndData || "0x"; + return userOperation; } /** @@ -71,34 +70,33 @@ export class BiconomyPaymaster implements IHybridPaymaster { + async buildTokenApprovalTransaction(tokenPaymasterRequest: BiconomyTokenPaymasterRequest): Promise { const feeTokenAddress: string = tokenPaymasterRequest.feeQuote.tokenAddress; - Logger.log("erc20 fee token address ", feeTokenAddress); const spender = tokenPaymasterRequest.spender; - Logger.log("spender address ", spender); // logging provider object isProvider - Logger.log("provider object passed - is provider", provider?._isProvider); + // Logger.log("provider object passed - is provider", provider?._isProvider); // TODO move below notes to separate method // Note: should also check in caller if the approval is already given, if yes return object with address or data 0 // Note: we would need userOp here to get the account/owner info to check allowance - let requiredApproval: BigNumberish = BigNumber.from(0).toString(); + let requiredApproval = BigInt(0); if (tokenPaymasterRequest.maxApproval && tokenPaymasterRequest.maxApproval == true) { - requiredApproval = ethers.constants.MaxUint256; + requiredApproval = BigInt(MAX_UINT256); } else { - requiredApproval = Math.ceil(tokenPaymasterRequest.feeQuote.maxGasFee * Math.pow(10, tokenPaymasterRequest.feeQuote.decimal)).toString(); + requiredApproval = BigInt(Math.ceil(tokenPaymasterRequest.feeQuote.maxGasFee * Math.pow(10, tokenPaymasterRequest.feeQuote.decimal))); } - Logger.log("required approval for erc20 token ", requiredApproval); - - const erc20Interface = new ethers.utils.Interface(JSON.stringify(ERC20_ABI)); - try { - const data = erc20Interface.encodeFunctionData("approve", [spender, requiredApproval]); + const parsedAbi = parseAbi(ERC20_ABI); + const data = encodeFunctionData({ + abi: parsedAbi, + functionName: "approve", + args: [spender, requiredApproval], + }); // TODO? // Note: For some tokens we may need to set allowance to 0 first so that would return batch of transactions and changes the return type to Transaction[] @@ -115,11 +113,10 @@ export class BiconomyPaymaster implements IHybridPaymaster, paymasterServiceData: FeeQuotesOrDataDto): Promise { - try { - userOp = await this.prepareUserOperation(userOp); - } catch (err) { - Logger.log("Error in prepareUserOperation ", err); - throw err; - } + async getPaymasterFeeQuotesOrData( + userOp: Partial, + paymasterServiceData: FeeQuotesOrDataDto, + ): Promise { + userOp = await this.prepareUserOperation(userOp); let mode = null; let expiryDuration = null; const calculateGasLimits = paymasterServiceData.calculateGasLimits ?? true; - Logger.log("calculateGasLimits is ", calculateGasLimits); let preferredToken = null; let feeTokensArray: string[] = []; // could make below null @@ -152,20 +146,16 @@ export class BiconomyPaymaster implements IHybridPaymaster = response.result.feeQuotes; - const paymasterAddress: string = response.result.paymasterAddress; + const paymasterAddress: Hex = response.result.paymasterAddress; // check all objects iterate and populate below calculation for all tokens return { feeQuotes: feeQuotesResponse, tokenPaymasterAddress: paymasterAddress }; } else if (response.result.mode == PaymasterMode.SPONSORED) { - const paymasterAndData: string = response.result.paymasterAndData; + const paymasterAndData: Hex = response.result.paymasterAndData; const preVerificationGas = response.result.preVerificationGas; const verificationGasLimit = response.result.verificationGasLimit; const callGasLimit = response.result.callGasLimit; @@ -226,7 +218,6 @@ export class BiconomyPaymaster implements IHybridPaymaster, + userOp: Partial, paymasterServiceData?: SponsorUserOperationDto, // mode is necessary. partial context of token paymaster or verifying ): Promise { - try { - userOp = await this.prepareUserOperation(userOp); - } catch (err) { - Logger.log("Error in prepareUserOperation ", err); - throw err; - } + userOp = await this.prepareUserOperation(userOp); if (paymasterServiceData?.mode === undefined) { throw new Error("mode is required in paymasterServiceData"); } const mode = paymasterServiceData.mode; - Logger.log("requested mode is ", mode); const calculateGasLimits = paymasterServiceData.calculateGasLimits ?? true; - Logger.log("calculateGasLimits is ", calculateGasLimits); let tokenInfo = null; let expiryDuration = null; @@ -286,7 +270,7 @@ export class BiconomyPaymaster implements IHybridPaymaster, - paymasterServiceData?: SponsorUserOperationDto, // mode is necessary. partial context of token paymaster or verifying + _userOp: Partial, + _paymasterServiceData?: SponsorUserOperationDto, // mode is necessary. partial context of token paymaster or verifying ): Promise { - Logger.log("userOp is ", userOp); - Logger.log("paymasterServiceData is ", paymasterServiceData); return "0x"; } + + public static async create(config: PaymasterConfig): Promise { + return new BiconomyPaymaster(config); + } } diff --git a/packages/paymaster/src/index.ts b/packages/paymaster/src/index.ts index fc7dd0950..4d78b3a0a 100644 --- a/packages/paymaster/src/index.ts +++ b/packages/paymaster/src/index.ts @@ -1,4 +1,8 @@ -export * from "./interfaces/IPaymaster"; -export * from "./interfaces/IHybridPaymaster"; -export * from "./utils/Types"; -export * from "./BiconomyPaymaster"; +import { BiconomyPaymaster } from "./BiconomyPaymaster.js"; +export * from "./interfaces/IPaymaster.js"; +export * from "./interfaces/IHybridPaymaster.js"; +export * from "./utils/Types.js"; +export * from "./BiconomyPaymaster.js"; + +export const Paymaster = BiconomyPaymaster; +export const createPaymaster = Paymaster.create; diff --git a/packages/paymaster/src/interfaces/IHybridPaymaster.ts b/packages/paymaster/src/interfaces/IHybridPaymaster.ts index aa1b51ebe..5b73bfd5e 100644 --- a/packages/paymaster/src/interfaces/IHybridPaymaster.ts +++ b/packages/paymaster/src/interfaces/IHybridPaymaster.ts @@ -1,12 +1,16 @@ -import { UserOperation } from "@biconomy/core-types"; -import { FeeQuotesOrDataResponse, BiconomyTokenPaymasterRequest, FeeQuotesOrDataDto, PaymasterAndDataResponse } from "../utils/Types"; -import { Transaction } from "@biconomy/core-types"; -import { Provider } from "@ethersproject/abstract-provider"; -import { IPaymaster } from "./IPaymaster"; +import { type UserOperationStruct } from "@alchemy/aa-core"; +import { + FeeQuotesOrDataResponse, + BiconomyTokenPaymasterRequest, + FeeQuotesOrDataDto, + PaymasterAndDataResponse, + type Transaction, +} from "../utils/Types.js"; +import { IPaymaster } from "./IPaymaster.js"; export interface IHybridPaymaster extends IPaymaster { - getPaymasterAndData(_userOp: Partial, _paymasterServiceData?: T): Promise; - getDummyPaymasterAndData(_userOp: Partial, _paymasterServiceData?: T): Promise; - buildTokenApprovalTransaction(_tokenPaymasterRequest: BiconomyTokenPaymasterRequest, _provider: Provider): Promise; - getPaymasterFeeQuotesOrData(_userOp: Partial, _paymasterServiceData: FeeQuotesOrDataDto): Promise; + getPaymasterAndData(_userOp: Partial, _paymasterServiceData?: T): Promise; + getDummyPaymasterAndData(_userOp: Partial, _paymasterServiceData?: T): Promise; + buildTokenApprovalTransaction(_tokenPaymasterRequest: BiconomyTokenPaymasterRequest): Promise; + getPaymasterFeeQuotesOrData(_userOp: Partial, _paymasterServiceData: FeeQuotesOrDataDto): Promise; } diff --git a/packages/paymaster/src/interfaces/IPaymaster.ts b/packages/paymaster/src/interfaces/IPaymaster.ts index 935392402..0d95801a5 100644 --- a/packages/paymaster/src/interfaces/IPaymaster.ts +++ b/packages/paymaster/src/interfaces/IPaymaster.ts @@ -1,8 +1,8 @@ -import { UserOperation } from "@biconomy/core-types"; +import { type UserOperationStruct } from "@alchemy/aa-core"; import { PaymasterAndDataResponse } from "../utils/Types"; export interface IPaymaster { // Implementing class may add extra parameter (for example paymasterServiceData with it's own type) in below function signature - getPaymasterAndData(_userOp: Partial): Promise; - getDummyPaymasterAndData(_userOp: Partial): Promise; + getPaymasterAndData(_userOp: Partial): Promise; + getDummyPaymasterAndData(_userOp: Partial): Promise; } diff --git a/packages/paymaster/src/constants.ts b/packages/paymaster/src/utils/Constants.ts similarity index 79% rename from packages/paymaster/src/constants.ts rename to packages/paymaster/src/utils/Constants.ts index d0efbcfe2..9a534ee8f 100644 --- a/packages/paymaster/src/constants.ts +++ b/packages/paymaster/src/utils/Constants.ts @@ -1,5 +1,6 @@ +export const MAX_UINT256 = "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"; export const ENTRYPOINT_ADDRESS = "0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789"; - +export const ADDRESS_ZERO = "0x0000000000000000000000000000000000000000"; // export const ERC20_PAYMASTER_ADDRESS = '0xE9f6Ffc87cac92bc94f704AE017e85cB83DBe4EC' // likely to be same address on all chains export const ERC20_ABI = [ diff --git a/packages/paymaster/src/utils/Helpers.ts b/packages/paymaster/src/utils/Helpers.ts new file mode 100644 index 000000000..b6f5568d2 --- /dev/null +++ b/packages/paymaster/src/utils/Helpers.ts @@ -0,0 +1,7 @@ +/** + * @description this function will return current timestamp in seconds + * @returns Number + */ +export const getTimestampInSeconds = (): number => { + return Math.floor(Date.now() / 1000); +}; diff --git a/packages/paymaster/src/utils/Types.ts b/packages/paymaster/src/utils/Types.ts index 10f783ba5..d1dd7ec9f 100644 --- a/packages/paymaster/src/utils/Types.ts +++ b/packages/paymaster/src/utils/Types.ts @@ -1,4 +1,5 @@ -import { BigNumberish } from "ethers"; +import { BigNumberish } from "@alchemy/aa-core"; +export type Hex = `0x${string}`; export type PaymasterServiceErrorResponse = { jsonrpc: string; @@ -6,8 +7,6 @@ export type PaymasterServiceErrorResponse = { error: JsonRpcError; }; -// Generic -/* eslint-disable @typescript-eslint/no-explicit-any */ export type JsonRpcResponse = { jsonrpc: string; id: number; @@ -15,7 +14,6 @@ export type JsonRpcResponse = { error?: JsonRpcError; }; -/* eslint-disable @typescript-eslint/no-explicit-any */ export type JsonRpcError = { code: string; message: string; @@ -28,27 +26,34 @@ export type PaymasterConfig = { }; export type SponsorUserOperationDto = { + /** mode: sponsored or erc20 */ mode: PaymasterMode; + /** Always recommended, especially when using token paymaster */ calculateGasLimits?: boolean; + /** Expiry duration in seconds */ expiryDuration?: number; - webhookData?: { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - [key: string]: any; - }; + /** Webhooks to be fired after user op is sent */ + webhookData?: Record; + /** Smart account meta data */ smartAccountInfo?: SmartAccountData; + /** the fee-paying token address */ feeTokenAddress?: string; }; export type FeeQuotesOrDataDto = { + /** mode: sponsored or erc20 */ mode?: PaymasterMode; + /** Expiry duration in seconds */ expiryDuration?: number; + /** Always recommended, especially when using token paymaster */ calculateGasLimits?: boolean; + /** List of tokens to be used for fee quotes, if ommitted fees for all supported will be returned */ tokenList?: string[]; + /** preferredToken: Can be ommitted to return all quotes */ preferredToken?: string; - webhookData?: { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - [key: string]: any; - }; + /** Webhooks to be fired after user op is sent */ + webhookData?: Record; + /** Smart account meta data */ smartAccountInfo?: SmartAccountData; }; @@ -62,52 +67,69 @@ export type FeeTokenInfo = { }; export type SponsorpshipInfo = { - webhookData?: { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - [key: string]: any; - }; + /** Webhooks to be fired after user op is sent */ + webhookData?: Record; + /** Smart account meta data */ smartAccountInfo: SmartAccountData; }; export type SmartAccountData = { + /** name: Name of the smart account */ name: string; + /** version: Version of the smart account */ version: string; }; export type PaymasterFeeQuote = { + /** symbol: Token symbol */ symbol: string; + /** tokenAddress: Token address */ tokenAddress: string; + /** decimal: Token decimal */ decimal: number; logoUrl?: string; + /** maxGasFee: in wei */ maxGasFee: number; + /** maxGasFee: in dollars */ maxGasFeeUSD?: number; usdPayment?: number; premiumPercentage: number; + /** validUntil: Unix timestamp */ validUntil?: number; }; export type BiconomyTokenPaymasterRequest = { + /** The feeQuote to be used for the transaction */ feeQuote: PaymasterFeeQuote; - spender: string; + /** The address of the spender. This is usually set to {@link FeeQuotesOrDataResponse.tokenPaymasterAddress} */ + spender: Hex; + /** Not recommended */ maxApproval?: boolean; }; export type FeeQuotesOrDataResponse = { + /** Array of results from the paymaster */ feeQuotes?: PaymasterFeeQuote[]; - tokenPaymasterAddress?: string; // spender - paymasterAndData?: string; + /** Normally set to the spender in the proceeding call to send the tx */ + tokenPaymasterAddress?: Hex; + /** Relevant Data returned from the paymaster */ + paymasterAndData?: Uint8Array | Hex; + /* Gas overhead of this UserOperation */ preVerificationGas?: BigNumberish; + /* Actual gas used by the validation of this UserOperation */ verificationGasLimit?: BigNumberish; + /* Value used by inner account execution */ callGasLimit?: BigNumberish; }; export type PaymasterAndDataResponse = { - paymasterAndData: string; - preVerificationGas?: BigNumberish; - verificationGasLimit?: BigNumberish; - callGasLimit?: BigNumberish; - maxPriorityFeePerGas?: BigNumberish; - maxFeePerGas?: BigNumberish; + paymasterAndData: Hex; + /* Gas overhead of this UserOperation */ + preVerificationGas: number; + /* Actual gas used by the validation of this UserOperation */ + verificationGasLimit: number; + /* Value used by inner account execution */ + callGasLimit: number; }; export enum PaymasterMode { @@ -125,9 +147,27 @@ export type EstimateUserOpGasResponse = { export type UserOpGasResponse = { paymasterAndData: string; + /* Gas overhead of this UserOperation */ preVerificationGas: string; maxPriorityFeePerGas: string; maxFeePerGas: string; + /* Actual gas used by the validation of this UserOperation */ verificationGasLimit: string; callGasLimit: string; }; + +type RequireAtLeastOne = Pick> & + { + [K in Keys]-?: Required> & Partial>>; + }[Keys]; + +type ValueOrData = RequireAtLeastOne< + { + value: BigNumberish | string; + data: string; + }, + "value" | "data" +>; +export type Transaction = { + to: string; +} & ValueOrData; diff --git a/packages/paymaster/tests/paymaster.e2e.spec.ts b/packages/paymaster/tests/paymaster.e2e.spec.ts new file mode 100644 index 000000000..3a634f491 --- /dev/null +++ b/packages/paymaster/tests/paymaster.e2e.spec.ts @@ -0,0 +1,19 @@ +import { TestData } from "../../../tests"; + +describe("Paymaster Unit Tests", () => { + let mumbai: TestData; + let baseSepolia: TestData; + + beforeEach(() => { + // @ts-ignore: Comes from setup-e2e-tests + [mumbai, baseSepolia] = testDataPerChain; + }); + + it("should have chain data for mumbai", () => { + expect(mumbai).toHaveProperty("chainId"); + }); + + it("should also have chain data for base", () => { + expect(baseSepolia).toHaveProperty("chainId"); + }); +}); diff --git a/packages/paymaster/tests/paymaster.spec.ts b/packages/paymaster/tests/paymaster.spec.ts index 54e655580..0b3508a6b 100644 --- a/packages/paymaster/tests/paymaster.spec.ts +++ b/packages/paymaster/tests/paymaster.spec.ts @@ -1,5 +1,14 @@ -describe("Paymaster Tests", () => { - it("should have a basic test", () => { - expect(true).toBe(true); +import { TestData } from "../../../tests"; + +describe("Paymaster Unit Tests", () => { + let ganache: TestData; + + beforeEach(() => { + // @ts-ignore: Comes from setup-unit-tests + [ganache] = testDataPerChain; + }); + + it("should have chain data for mumbai", () => { + expect(ganache).toHaveProperty("chainId"); }); }); diff --git a/packages/paymaster/tsconfig.build.json b/packages/paymaster/tsconfig.build.json new file mode 100644 index 000000000..4ac8b8026 --- /dev/null +++ b/packages/paymaster/tsconfig.build.json @@ -0,0 +1,32 @@ +{ + "$schema": "https://json.schemastore.org/tsconfig", + "display": "Build", + "compilerOptions": { + "lib": ["es2022", "dom"], + "target": "es2021", + "types": ["node"], + "allowJs": false, + "skipLibCheck": true, + "esModuleInterop": true, + "allowSyntheticDefaultImports": true, + "strict": true, + "forceConsistentCasingInFileNames": true, + "module": "esnext", + "moduleResolution": "node", + "resolveJsonModule": true, + "isolatedModules": true, + "verbatimModuleSyntax": false, + "useDefineForClassFields": true, + "noFallthroughCasesInSwitch": true, + "noImplicitReturns": true, + "useUnknownInCatchVariables": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "declaration": true, + "inlineSources": true, + "noEmit": false, + "sourceMap": true + }, + "exclude": ["**/*/node_modules", "**/*/tests", "tests"], + "include": ["src"] +} \ No newline at end of file diff --git a/packages/paymaster/tsconfig.json b/packages/paymaster/tsconfig.json index 3dc5293ed..d6269c535 100644 --- a/packages/paymaster/tsconfig.json +++ b/packages/paymaster/tsconfig.json @@ -5,7 +5,8 @@ "outDir": "dist", "baseUrl": "src", "resolveJsonModule": true, - "esModuleInterop": true + "esModuleInterop": true, + "types": ["node"] }, "include": ["src", "src/**/*.json"] } diff --git a/packages/transak/.esbuild.js b/packages/transak/.esbuild.js new file mode 100644 index 000000000..ca355e346 --- /dev/null +++ b/packages/transak/.esbuild.js @@ -0,0 +1,58 @@ +const esbuildPluginTsc = require("esbuild-plugin-tsc"); +const esbuild = require("esbuild"); +const { dependencies, peerDependencies = {} } = require("./package.json"); +const { Generator } = require("npm-dts"); + +const COMMON_SETTINGS = { + entryPoints: ["src/index.ts"], + minify: true, + bundle: true, + plugins: [esbuildPluginTsc({ force: true })], +}; + +const ESM_SETTINGS = { + ...COMMON_SETTINGS, + sourcemap: true, + outfile: "dist/esm/index.js", + platform: "browser", + target: "esnext", + format: "esm", + mainFields: ["browser", "module", "main"], +}; +const buildForESM = async () => await esbuild.build(ESM_SETTINGS); + +const CJS_SETTINGS = { + ...COMMON_SETTINGS, + format: "cjs", + sourcemap: false, + outfile: "dist/cjs/index.js", + platform: "node", +}; + +const watchForCJS = async () => { + let ctx = await esbuild.context(CJS_SETTINGS); + await ctx.watch(); + await ctx.serve({ servedir: "dist/src" }); + console.log("watching..."); +}; + +const buildForCJS = async () => await esbuild.build(CJS_SETTINGS); +const buildForTYP = async () => await new Generator({ entry: "src/index.ts", output: "dist/types/index.d.ts" }).generate(); + +(async () => { + const buildType = process.argv.slice(2)[0]; + const shouldWatch = process.argv.slice(3)[0] === "--watch"; + if (!buildType) { + console.log("No build type provided"); + process.exit(1); + } + console.log(`Building for ${buildType}`); + if (buildType === "ESM") { + await buildForESM(); + } else if (buildType === "CJS") { + console.log("watching? " + shouldWatch); + await (shouldWatch ? watchForCJS : buildForCJS)(); + } else if (buildType === "TYP") { + await buildForTYP(); + } +})(); diff --git a/packages/transak/CHANGELOG.md b/packages/transak/CHANGELOG.md index ed5d38a5a..c71de7918 100644 --- a/packages/transak/CHANGELOG.md +++ b/packages/transak/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## 4.0.0 (2023-12-28) + +VERSION Bump Only. + ## 3.1.3 (2023-12-28) VERSION Bump Only. diff --git a/packages/transak/package.json b/packages/transak/package.json index 4e523be85..018414ed1 100644 --- a/packages/transak/package.json +++ b/packages/transak/package.json @@ -1,9 +1,19 @@ { "name": "@biconomy/transak", - "version": "3.1.3", + "version": "4.0.0", "description": "transak for biconomy sdk", - "main": "./dist/src/index.js", - "typings": "./dist/src/index.d.ts", + "main": "./dist/cjs/index.js", + "module": "./dist/esm/index.js", + "types": "./dist/types/index.d.ts", + "typings": "./dist/types/index.d.ts", + "exports": { + ".": { + "import": "./dist/esm/index.js", + "types": "./dist/types/index.d.ts", + "default": "./dist/cjs/index.js" + }, + "./package.json": "./package.json" + }, "keywords": [ "legos", "batching", @@ -11,7 +21,7 @@ "cross-chain", "transak" ], - "author": "livingrockrises ", + "author": "Biconomy", "homepage": "https://github.com/bcnmy/biconomy-client-sdk#readme", "license": "MIT", "files": [ @@ -24,7 +34,16 @@ }, "scripts": { "unbuild": "rimraf dist *.tsbuildinfo", - "build": "rimraf dist && tsc", + "build:watch": "yarn build:tsc --watch", + "dist:minify": "esbuild ./dist/esm/**/*.js ./dist/esm/*.js --minify --outdir=./dist/esm --bundle=false --allow-overwrite", + "build": "yarn unbuild && yarn build:tsc", + "build:esbuild": "yarn build:esbuild:cjs && yarn build:esbuild:esm && yarn build:typ", + "build:tsc:cjs": "tsc --project tsconfig.build.json --module commonjs --outDir ./dist/cjs --removeComments --verbatimModuleSyntax false && echo > ./dist/cjs/package.json '{\"type\":\"commonjs\"}'", + "build:tsc:esm": "tsc --project tsconfig.build.json --module esnext --outDir ./dist/esm --removeComments && echo > ./dist/esm/package.json '{\"type\":\"module\"}'", + "build:esbuild:cjs": "node .esbuild.js CJS && echo > ./dist/cjs/package.json '{\"type\":\"commonjs\"}'", + "build:esbuild:esm": "node .esbuild.js ESM && echo > ./dist/esm/package.json '{\"type\":\"module\"}'", + "build:typ": "tsc --project tsconfig.build.json --module esnext --declarationDir ./dist/types --emitDeclarationOnly --declaration --declarationMap", + "build:tsc": "yarn build:tsc:cjs && yarn build:tsc:esm && yarn build:typ && yarn dist:minify", "format": "prettier --write \"{src,tests}/**/*.ts\"", "lint": "tslint -p tsconfig.json" }, @@ -36,5 +55,11 @@ }, "dependencies": { "@transak/transak-sdk": "^1.2.3" + }, + "devDependencies": { + "@types/node": "^20.11.10", + "esbuild": "^0.19.11", + "esbuild-plugin-tsc": "^0.4.0", + "npm-dts": "^1.3.12" } } diff --git a/packages/transak/src/index.ts b/packages/transak/src/index.ts index 6792b304a..36f5dcfd9 100644 --- a/packages/transak/src/index.ts +++ b/packages/transak/src/index.ts @@ -1,7 +1,7 @@ /* eslint-disable @typescript-eslint/ban-ts-comment */ // @ts-ignore import transakSDK from "@transak/transak-sdk"; -import { ITransakDto, environments } from "interface"; +import { ITransakDto, environments } from "./interface.js"; class TransakSDK { apiKey: string; diff --git a/packages/transak/tsconfig.build.json b/packages/transak/tsconfig.build.json new file mode 100644 index 000000000..4ac8b8026 --- /dev/null +++ b/packages/transak/tsconfig.build.json @@ -0,0 +1,32 @@ +{ + "$schema": "https://json.schemastore.org/tsconfig", + "display": "Build", + "compilerOptions": { + "lib": ["es2022", "dom"], + "target": "es2021", + "types": ["node"], + "allowJs": false, + "skipLibCheck": true, + "esModuleInterop": true, + "allowSyntheticDefaultImports": true, + "strict": true, + "forceConsistentCasingInFileNames": true, + "module": "esnext", + "moduleResolution": "node", + "resolveJsonModule": true, + "isolatedModules": true, + "verbatimModuleSyntax": false, + "useDefineForClassFields": true, + "noFallthroughCasesInSwitch": true, + "noImplicitReturns": true, + "useUnknownInCatchVariables": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "declaration": true, + "inlineSources": true, + "noEmit": false, + "sourceMap": true + }, + "exclude": ["**/*/node_modules", "**/*/tests", "tests"], + "include": ["src"] +} \ No newline at end of file diff --git a/packages/transak/tsconfig.json b/packages/transak/tsconfig.json index eb424084f..d9b305a9a 100644 --- a/packages/transak/tsconfig.json +++ b/packages/transak/tsconfig.json @@ -1,12 +1,13 @@ { "extends": "../../tsconfig.settings.json", "compilerOptions": { - "jsx": "react", "composite": true, "outDir": "dist", "baseUrl": "src", "resolveJsonModule": true, - "esModuleInterop": true + "esModuleInterop": true, + "lib": ["es2020"], + "types": ["node"] }, "include": ["src", "src/**/*.json"] } diff --git a/rebuild.sh b/rebuild.sh index 8d555308d..39c4c1a94 100755 --- a/rebuild.sh +++ b/rebuild.sh @@ -4,52 +4,30 @@ rm -rf yarn.lock rm -rf node_modules rm -rf packages/account/node_modules +rm -rf packages/account/yarn.lock rm -rf packages/account/package-lock.json rm -rf packages/account/dist rm -rf packages/bundler/node_modules +rm -rf packages/bundler/yarn.lock rm -rf packages/bundler/package-lock.json rm -rf packages/bundler/dist +rm -rf packages/common/node_modules +rm -rf packages/common/yarn.lock +rm -rf packages/common/package-lock.json +rm -rf packages/common/dist + rm -rf packages/paymaster/node_modules +rm -rf packages/paymaster/yarn.lock rm -rf packages/paymaster/package-lock.json rm -rf packages/paymaster/dist - rm -rf packages/modules/node_modules +rm -rf packages/modules/yarn.lock rm -rf packages/modules/package-lock.json rm -rf packages/modules/dist - -rm -rf packages/signers/node_modules -rm -rf packages/signers/package-lock.json -rm -rf packages/signers/dist - - -rm -rf packages/common/node_modules -rm -rf packages/common/package-lock.json -rm -rf packages/common/dist -rm -rf packages/common/src/typechain - -rm -rf packages/core-types/node_modules -rm -rf packages/core-types/package-lock.json -rm -rf packages/core-types/dist - -rm -rf packages/node-client/node_modules -rm -rf packages/node-client/package-lock.json -rm -rf packages/node-client/dist - - -rm -rf packages/web3-auth/node_modules -rm -rf packages/web3-auth/yarn.lock -rm -rf packages/web3-auth/package-lock.json -rm -rf packages/web3-auth/dist - -rm -rf packages/web3-auth-native/node_modules -rm -rf packages/web3-auth-native/yarn.lock -rm -rf packages/web3-auth-native/package-lock.json -rm -rf packages/web3-auth-native/dist - rm -rf packages/transak/node_modules rm -rf packages/transak/yarn.lock rm -rf packages/transak/package-lock.json diff --git a/tests/chains.config.ts b/tests/chains.config.ts new file mode 100644 index 000000000..c82722a70 --- /dev/null +++ b/tests/chains.config.ts @@ -0,0 +1,43 @@ +import { localhost, Chain } from "viem/chains"; +import { polygonMumbai, baseSepolia } from "viem/chains"; +import { config } from "dotenv"; + +config(); + +export type SupportedTestChain = "ganache" | "baseSepolia" | "mumbai"; +type BaseChainConfig = { + chainId: number; + entryPointAddress: string; + bundlerUrl: string; + paymasterUrl?: string; + viemChain: Chain; + biconomyPaymasterApiKey?: string; +}; +export const CHAIN_CONFIG: Record = { + ganache: { // No useful bundler or paymaster tests for ganache + chainId: 1337, + entryPointAddress: "0x5ff137d4b0fdcd49dca30c7cf57e578a026d2789", + bundlerUrl: "https://bundler.biconomy.io/api/v2/1/cJPK7B3ru.dd7f7861-190d-45ic-af80-6877f74b8f44", + viemChain: localhost, + }, + baseSepolia: { + chainId: 84532, + entryPointAddress: "0x5ff137d4b0fdcd49dca30c7cf57e578a026d2789", + bundlerUrl: "https://bundler.biconomy.io/api/v2/84532/cJPK7B3ru.dd7f7861-190d-45ic-af80-6877f74b8f44", + paymasterUrl: "https://paymaster.biconomy.io/api/v1/84532/" + process.env.E2E_BICO_PAYMASTER_KEY_BASE!, + viemChain: baseSepolia, + biconomyPaymasterApiKey: process.env.E2E_BICO_PAYMASTER_KEY_BASE!, + }, + mumbai: { + chainId: 80001, + entryPointAddress: "0x5ff137d4b0fdcd49dca30c7cf57e578a026d2789", + bundlerUrl: "https://bundler.biconomy.io/api/v2/80001/cJPK7B3ru.dd7f7861-190d-45ic-af80-6877f74b8f44", + paymasterUrl: "https://paymaster.biconomy.io/api/v1/80001/" + process.env.E2E_BICO_PAYMASTER_KEY_MUMBAI!, + viemChain: polygonMumbai, + biconomyPaymasterApiKey: process.env.E2E_BICO_PAYMASTER_KEY_MUMBAI!, + }, +}; +export const E2E_TEST_CHAINS = [CHAIN_CONFIG.mumbai, CHAIN_CONFIG.baseSepolia]; +export const UNIT_TEST_CHAIN = CHAIN_CONFIG.ganache; + +export default CHAIN_CONFIG; \ No newline at end of file diff --git a/tests/index.d.ts b/tests/index.d.ts new file mode 100644 index 000000000..d3093f47a --- /dev/null +++ b/tests/index.d.ts @@ -0,0 +1,26 @@ +import { Chain, Hex, PrivateKeyAccount, PublicClient, WalletClient } from "viem"; +import { WalletClientSigner } from "@alchemy/aa-core"; +import { JsonRpcProvider } from "@ethersproject/providers"; +import { Signer } from "@ethersproject/abstract-signer"; + +interface WalletProps { + alchemyWalletClientSigner: WalletClientSigner; + viemWallet: WalletClient; + balance: BigInt; + publicAddress: Hex; + account: PrivateKeyAccount; + privateKey: Hex; + ethersSigner: Signer; +} + +export type TestData = { + whale: WalletProps; + minnow: WalletProps; + publicClient: PublicClient; + chainId: number; + bundlerUrl: string; + entryPointAddress: string; + viemChain: Chain; + biconomyPaymasterApiKey: string; + ethersProvider: JsonRpcProvider; +}; diff --git a/tests/setup-e2e-tests.ts b/tests/setup-e2e-tests.ts new file mode 100644 index 000000000..a95150f4a --- /dev/null +++ b/tests/setup-e2e-tests.ts @@ -0,0 +1,142 @@ +import { createWalletClient, http, createPublicClient } from "viem"; +import { JsonRpcProvider } from "@ethersproject/providers"; +import { Wallet } from "@ethersproject/wallet"; +import { privateKeyToAccount } from "viem/accounts"; +import { WalletClientSigner } from "@alchemy/aa-core"; +import { config } from "dotenv"; +import { E2E_TEST_CHAINS } from "./chains.config"; + +config(); + +beforeAll(async () => { + envVarCheck(); + + const privateKeyOne: `0x${string}` = `0x${process.env.E2E_PRIVATE_KEY_ONE}`; + const privateKeyTwo: `0x${string}` = `0x${process.env.E2E_PRIVATE_KEY_TWO}`; + const walletOne = privateKeyToAccount(privateKeyOne); + const walletTwo = privateKeyToAccount(privateKeyTwo); + + const promises = E2E_TEST_CHAINS.map((chain) => { + const ethersProvider = new JsonRpcProvider(chain.viemChain.rpcUrls.default.http[0]); + const ethersSignerOne = new Wallet(privateKeyOne, ethersProvider); + const ethersSignerTwo = new Wallet(privateKeyTwo, ethersProvider); + + const publicClient = createPublicClient({ + chain: chain.viemChain, + transport: http(), + }); + + const viemWalletClientOne = createWalletClient({ + account: walletOne, + chain: chain.viemChain, + transport: http(chain.viemChain.rpcUrls.default.http[0]), + }); + const viemWalletClientTwo = createWalletClient({ + account: walletTwo, + chain: chain.viemChain, + transport: http(chain.viemChain.rpcUrls.default.http[0]), + }); + const walletClientSignerOne = new WalletClientSigner(viemWalletClientOne, "viem"); + const walletClientSignerTwo = new WalletClientSigner(viemWalletClientTwo, "viem"); + + return Promise.all([ + Promise.all([ + { + ...chain, + publicClient, + account: walletOne, + publicAddress: walletOne.address, + viemWallet: viemWalletClientOne, + alchemyWalletClientSigner: walletClientSignerOne, + ethersProvider, + ethersSigner: ethersSignerOne, + privateKey: privateKeyOne, + }, + publicClient.getBalance({ + address: walletOne.address, + }), + ]), + Promise.all([ + { + ...chain, + publicClient, + account: walletTwo, + publicAddress: walletTwo.address, + viemWallet: viemWalletClientTwo, + alchemyWalletClientSigner: walletClientSignerTwo, + ethersProvider, + ethersSigner: ethersSignerTwo, + privateKey: privateKeyTwo, + }, + publicClient.getBalance({ + address: walletTwo.address, + }), + ]), + ]); + }); + const balancesPerChain = await Promise.all(promises); + + // @ts-ignore + testDataPerChain = balancesPerChain.map((dataAndBalanceArray) => { + const sortedBalances = dataAndBalanceArray + .map(([datum, balance]) => ({ + ...datum, + balance, + })) + .sort((a, b) => { + if (a.balance > b.balance) { + return 1; + } else if (a.balance > b.balance) { + return -1; + } else { + return 0; + } + }); + + const whaleBalance = sortedBalances[0]; + const minnowBalance = sortedBalances[1]; + + const commonData = { + publicClient: whaleBalance.publicClient, + chainId: whaleBalance.chainId, + bundlerUrl: whaleBalance.bundlerUrl, + entryPointAddress: whaleBalance.entryPointAddress, + viemChain: whaleBalance.viemChain, + biconomyPaymasterApiKey: whaleBalance.biconomyPaymasterApiKey, + ethersProvider: whaleBalance.ethersProvider, + paymasterUrl: whaleBalance.paymasterUrl, + }; + + const datum = { + ...commonData, + whale: { + balance: whaleBalance.balance, + viemWallet: whaleBalance.viemWallet, + alchemyWalletClientSigner: whaleBalance.alchemyWalletClientSigner, + publicAddress: whaleBalance.publicAddress, + account: whaleBalance.account, + ethersSigner: whaleBalance.ethersSigner, + privateKey: whaleBalance.privateKey, + }, + minnow: { + balance: minnowBalance.balance, + viemWallet: minnowBalance.viemWallet, + alchemyWalletClientSigner: minnowBalance.alchemyWalletClientSigner, + publicAddress: minnowBalance.publicAddress, + account: minnowBalance.account, + ethersSigner: whaleBalance.ethersSigner, + privateKey: minnowBalance.privateKey, + }, + }; + return datum; + }); +}); + +const envVarCheck = () => { + const REQUIRED_FIELDS = ["E2E_PRIVATE_KEY_ONE", "E2E_PRIVATE_KEY_TWO", "E2E_BICO_PAYMASTER_KEY_MUMBAI", "E2E_BICO_PAYMASTER_KEY_BASE"]; + const hasFields = REQUIRED_FIELDS.every((field) => !!process.env[field]); + if (!hasFields) { + console.error("Missing env var"); + process.exit(0); + } +}; diff --git a/tests/setup-unit-tests.ts b/tests/setup-unit-tests.ts new file mode 100644 index 000000000..03360b043 --- /dev/null +++ b/tests/setup-unit-tests.ts @@ -0,0 +1,75 @@ +import { createWalletClient, http, createPublicClient } from "viem"; +import { WalletClientSigner } from "@alchemy/aa-core"; +import { JsonRpcProvider } from "@ethersproject/providers"; +import { Wallet } from "@ethersproject/wallet"; +import { UNIT_TEST_CHAIN } from "./chains.config"; +import { privateKeyToAccount, generatePrivateKey } from "viem/accounts"; + +beforeAll(() => { + const { chainId, bundlerUrl, viemChain, entryPointAddress } = UNIT_TEST_CHAIN; + const privateKeyOne = generatePrivateKey(); + const accountOne = privateKeyToAccount(privateKeyOne); + + const ethersProvider = new JsonRpcProvider(viemChain.rpcUrls.default.http[0]); + const ethersSignerOne = new Wallet(privateKeyOne, ethersProvider); + + const viemWalletClientOne = createWalletClient({ + account: accountOne, + chain: viemChain, + transport: http(viemChain.rpcUrls.default.http[0]), + }); + + const walletClientSignerOne = new WalletClientSigner(viemWalletClientOne, "viem"); + const publicAddressOne = accountOne.address; + const publicClient = createPublicClient({ + chain: viemChain, + transport: http(), + }); + + const privateKeyTwo = generatePrivateKey(); + const accountTwo = privateKeyToAccount(privateKeyTwo); + + const ethersSignerTwo = new Wallet(privateKeyTwo, ethersProvider); + + const viemWalletClientTwo = createWalletClient({ + account: accountTwo, + chain: viemChain, + transport: http(viemChain.rpcUrls.default.http[0]), + }); + const walletClientSignerTwo = new WalletClientSigner(viemWalletClientTwo, "viem"); + const publicAddressTwo = accountTwo.address; + + const whale = { + viemWallet: viemWalletClientOne, + alchemyWalletClientSigner: walletClientSignerOne, + balance: 0, + publicAddress: publicAddressOne, + ethersSigner: ethersSignerOne, + account: accountOne, + privateKey: privateKeyOne, + }; + + const minnow = { + viemWallet: viemWalletClientTwo, + alchemyWalletClientSigner: walletClientSignerTwo, + balance: 0, + publicAddress: publicAddressTwo, + ethersSigner: ethersSignerTwo, + account: accountTwo, + privateKey: privateKeyTwo, + }; + + // @ts-ignore + testDataPerChain = [ + { + whale, + minnow, + publicClient, + chainId, + bundlerUrl, + entryPointAddress, + viemChain, + ethersProvider, + }, + ]; +}); diff --git a/tests/utils.ts b/tests/utils.ts new file mode 100644 index 000000000..c010435f6 --- /dev/null +++ b/tests/utils.ts @@ -0,0 +1,45 @@ +import { Hex, PublicClient, parseAbi } from "viem"; + +export const checkBalance = (publicClient: PublicClient, address: Hex, tokenAddress?: Hex) => { + if (!tokenAddress) { + return publicClient.getBalance({ address }); + } else { + return publicClient.readContract({ + address: tokenAddress, + abi: parseAbi(["function balanceOf(address owner) view returns (uint balance)"]), + functionName: "balanceOf", + // @ts-ignore + args: [address], + }); + } +}; + +// TODO(Joe): Make human readable +export const entryPointABI = [ + { + inputs: [ + { + components: [ + { internalType: "address", name: "sender", type: "address" }, + { internalType: "uint256", name: "nonce", type: "uint256" }, + { internalType: "bytes", name: "initCode", type: "bytes" }, + { internalType: "bytes", name: "callData", type: "bytes" }, + { internalType: "uint256", name: "callGasLimit", type: "uint256" }, + { internalType: "uint256", name: "verificationGasLimit", type: "uint256" }, + { internalType: "uint256", name: "preVerificationGas", type: "uint256" }, + { internalType: "uint256", name: "maxFeePerGas", type: "uint256" }, + { internalType: "uint256", name: "maxPriorityFeePerGas", type: "uint256" }, + { internalType: "bytes", name: "paymasterAndData", type: "bytes" }, + { internalType: "bytes", name: "signature", type: "bytes" }, + ], + internalType: "struct UserOperation", + name: "userOp", + type: "tuple", + }, + ], + name: "getUserOpHash", + outputs: [{ internalType: "bytes32", name: "", type: "bytes32" }], + stateMutability: "view", + type: "function", + }, +]; diff --git a/tsconfig.json b/tsconfig.json index 3ad9d22bd..8172cdac6 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -11,14 +11,12 @@ }, "include": ["packages/**/*"], "references": [ - { "path": "./packages/common" }, - { "path": "./packages/core-types" }, - { "path": "./packages/node-client" }, - { "path": "./packages/web3-auth" }, - { "path": "./packages/web3-auth-native" }, { "path": "./packages/transak" }, { "path": "./packages/bundler" }, + { "path": "./packages/particle-auth" }, { "path": "./packages/paymaster" }, - { "path": "./packages/account" } + { "path": "./packages/account" }, + { "path": "./packages/common" }, + { "path": "./packages/modules" }, ] } diff --git a/yarn.lock b/yarn.lock new file mode 100644 index 000000000..3a06bfd22 --- /dev/null +++ b/yarn.lock @@ -0,0 +1,9886 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@aashutoshrathi/word-wrap@^1.2.3": + version "1.2.6" + resolved "https://registry.yarnpkg.com/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz#bd9154aec9983f77b3a034ecaa015c2e4201f6cf" + integrity sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA== + +"@adraffy/ens-normalize@1.10.0": + version "1.10.0" + resolved "https://registry.yarnpkg.com/@adraffy/ens-normalize/-/ens-normalize-1.10.0.tgz#d2a39395c587e092d77cbbc80acf956a54f38bf7" + integrity sha512-nA9XHtlAkYfJxY7bce8DcN7eKxWWCWkU+1GR9d+U6MbNpfwQp8TI7vqOsBsMcHoT4mBu2kypKoSKnghEzOOq5Q== + +"@alchemy/aa-core@3.0.0-alpha.4": + version "3.0.0-alpha.4" + resolved "https://registry.yarnpkg.com/@alchemy/aa-core/-/aa-core-3.0.0-alpha.4.tgz#3abe0911f7c35cc6f0fc0cd03faad5673a01f0a9" + integrity sha512-mTVMDciBYIrXRgJnDiew2nRhjeAMKIK3RijGR3TQ7Gn6cpY8ZKSiJoTM5yRCttx368jqz0BACD1mjTg/zU8+Cg== + dependencies: + abitype "^0.8.3" + eventemitter3 "^5.0.1" + viem "^2.5.0" + zod "^3.22.4" + +"@ampproject/remapping@^2.2.0": + version "2.2.1" + resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.1.tgz#99e8e11851128b8702cd57c33684f1d0f260b630" + integrity sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg== + dependencies: + "@jridgewell/gen-mapping" "^0.3.0" + "@jridgewell/trace-mapping" "^0.3.9" + +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.23.5": + version "7.23.5" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.23.5.tgz#9009b69a8c602293476ad598ff53e4562e15c244" + integrity sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA== + dependencies: + "@babel/highlight" "^7.23.4" + chalk "^2.4.2" + +"@babel/compat-data@^7.23.5": + version "7.23.5" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.23.5.tgz#ffb878728bb6bdcb6f4510aa51b1be9afb8cfd98" + integrity sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw== + +"@babel/core@^7.11.6", "@babel/core@^7.12.3": + version "7.23.9" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.23.9.tgz#b028820718000f267870822fec434820e9b1e4d1" + integrity sha512-5q0175NOjddqpvvzU+kDiSOAk4PfdO6FvwCWoQ6RO7rTzEe8vlo+4HVfcnAREhD4npMs0e9uZypjTwzZPCf/cw== + dependencies: + "@ampproject/remapping" "^2.2.0" + "@babel/code-frame" "^7.23.5" + "@babel/generator" "^7.23.6" + "@babel/helper-compilation-targets" "^7.23.6" + "@babel/helper-module-transforms" "^7.23.3" + "@babel/helpers" "^7.23.9" + "@babel/parser" "^7.23.9" + "@babel/template" "^7.23.9" + "@babel/traverse" "^7.23.9" + "@babel/types" "^7.23.9" + convert-source-map "^2.0.0" + debug "^4.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.2.3" + semver "^6.3.1" + +"@babel/generator@^7.23.6", "@babel/generator@^7.7.2": + version "7.23.6" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.23.6.tgz#9e1fca4811c77a10580d17d26b57b036133f3c2e" + integrity sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw== + dependencies: + "@babel/types" "^7.23.6" + "@jridgewell/gen-mapping" "^0.3.2" + "@jridgewell/trace-mapping" "^0.3.17" + jsesc "^2.5.1" + +"@babel/helper-compilation-targets@^7.23.6": + version "7.23.6" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz#4d79069b16cbcf1461289eccfbbd81501ae39991" + integrity sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ== + dependencies: + "@babel/compat-data" "^7.23.5" + "@babel/helper-validator-option" "^7.23.5" + browserslist "^4.22.2" + lru-cache "^5.1.1" + semver "^6.3.1" + +"@babel/helper-environment-visitor@^7.22.20": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz#96159db61d34a29dba454c959f5ae4a649ba9167" + integrity sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA== + +"@babel/helper-function-name@^7.23.0": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz#1f9a3cdbd5b2698a670c30d2735f9af95ed52759" + integrity sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw== + dependencies: + "@babel/template" "^7.22.15" + "@babel/types" "^7.23.0" + +"@babel/helper-hoist-variables@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz#c01a007dac05c085914e8fb652b339db50d823bb" + integrity sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-module-imports@^7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz#16146307acdc40cc00c3b2c647713076464bdbf0" + integrity sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w== + dependencies: + "@babel/types" "^7.22.15" + +"@babel/helper-module-transforms@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz#d7d12c3c5d30af5b3c0fcab2a6d5217773e2d0f1" + integrity sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ== + dependencies: + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-module-imports" "^7.22.15" + "@babel/helper-simple-access" "^7.22.5" + "@babel/helper-split-export-declaration" "^7.22.6" + "@babel/helper-validator-identifier" "^7.22.20" + +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.22.5", "@babel/helper-plugin-utils@^7.8.0": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz#dd7ee3735e8a313b9f7b05a773d892e88e6d7295" + integrity sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg== + +"@babel/helper-simple-access@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz#4938357dc7d782b80ed6dbb03a0fba3d22b1d5de" + integrity sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-split-export-declaration@^7.22.6": + version "7.22.6" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz#322c61b7310c0997fe4c323955667f18fcefb91c" + integrity sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-string-parser@^7.23.4": + version "7.23.4" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz#9478c707febcbbe1ddb38a3d91a2e054ae622d83" + integrity sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ== + +"@babel/helper-validator-identifier@^7.22.20": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz#c4ae002c61d2879e724581d96665583dbc1dc0e0" + integrity sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A== + +"@babel/helper-validator-option@^7.23.5": + version "7.23.5" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz#907a3fbd4523426285365d1206c423c4c5520307" + integrity sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw== + +"@babel/helpers@^7.23.9": + version "7.23.9" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.23.9.tgz#c3e20bbe7f7a7e10cb9b178384b4affdf5995c7d" + integrity sha512-87ICKgU5t5SzOT7sBMfCOZQ2rHjRU+Pcb9BoILMYz600W6DkVRLFBPwQ18gwUVvggqXivaUakpnxWQGbpywbBQ== + dependencies: + "@babel/template" "^7.23.9" + "@babel/traverse" "^7.23.9" + "@babel/types" "^7.23.9" + +"@babel/highlight@^7.23.4": + version "7.23.4" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.23.4.tgz#edaadf4d8232e1a961432db785091207ead0621b" + integrity sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A== + dependencies: + "@babel/helper-validator-identifier" "^7.22.20" + chalk "^2.4.2" + js-tokens "^4.0.0" + +"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.23.9": + version "7.23.9" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.23.9.tgz#7b903b6149b0f8fa7ad564af646c4c38a77fc44b" + integrity sha512-9tcKgqKbs3xGJ+NtKF2ndOBBLVwPjl1SHxPQkd36r3Dlirw3xWUeGaTbqr7uGZcTaxkVNwc+03SVP7aCdWrTlA== + +"@babel/plugin-syntax-async-generators@^7.8.4": + version "7.8.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" + integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-bigint@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz#4c9a6f669f5d0cdf1b90a1671e9a146be5300cea" + integrity sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-class-properties@^7.8.3": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz#b5c987274c4a3a82b89714796931a6b53544ae10" + integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-syntax-import-meta@^7.8.3": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz#ee601348c370fa334d2207be158777496521fd51" + integrity sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-json-strings@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a" + integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-jsx@^7.7.2": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.23.3.tgz#8f2e4f8a9b5f9aa16067e142c1ac9cd9f810f473" + integrity sha512-EB2MELswq55OHUoRZLGg/zC7QWUKfNLpE57m/S2yr1uEneIgsTgrSzXP3NXEsMkVn76OlaVVnzN+ugObuYGwhg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-syntax-logical-assignment-operators@^7.8.3": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699" + integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9" + integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-numeric-separator@^7.8.3": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97" + integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-object-rest-spread@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" + integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-optional-catch-binding@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1" + integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-optional-chaining@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a" + integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-top-level-await@^7.8.3": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz#c1cfdadc35a646240001f06138247b741c34d94c" + integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-typescript@^7.7.2": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.23.3.tgz#24f460c85dbbc983cd2b9c4994178bcc01df958f" + integrity sha512-9EiNjVJOMwCO+43TqoTrgQ8jMwcAd0sWyXi9RPfIsLTj4R2MADDDQXELhffaUx/uJv2AYcxBgPwH6j4TIA4ytQ== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/runtime@^7.21.0": + version "7.23.9" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.23.9.tgz#47791a15e4603bb5f905bc0753801cf21d6345f7" + integrity sha512-0CX6F+BI2s9dkUqr08KFrAIZgNFj75rdBU/DjCyYLIaV/quFjkk6T+EJ2LkZHyZTbEV4L5p97mNkUsHl2wLFAw== + dependencies: + regenerator-runtime "^0.14.0" + +"@babel/template@^7.22.15", "@babel/template@^7.23.9", "@babel/template@^7.3.3": + version "7.23.9" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.23.9.tgz#f881d0487cba2828d3259dcb9ef5005a9731011a" + integrity sha512-+xrD2BWLpvHKNmX2QbpdpsBaWnRxahMwJjO+KZk2JOElj5nSmKezyS1B4u+QbHMTX69t4ukm6hh9lsYQ7GHCKA== + dependencies: + "@babel/code-frame" "^7.23.5" + "@babel/parser" "^7.23.9" + "@babel/types" "^7.23.9" + +"@babel/traverse@^7.23.9": + version "7.23.9" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.23.9.tgz#2f9d6aead6b564669394c5ce0f9302bb65b9d950" + integrity sha512-I/4UJ9vs90OkBtY6iiiTORVMyIhJ4kAVmsKo9KFc8UOxMeUfi2hvtIBsET5u9GizXE6/GFSuKCTNfgCswuEjRg== + dependencies: + "@babel/code-frame" "^7.23.5" + "@babel/generator" "^7.23.6" + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-function-name" "^7.23.0" + "@babel/helper-hoist-variables" "^7.22.5" + "@babel/helper-split-export-declaration" "^7.22.6" + "@babel/parser" "^7.23.9" + "@babel/types" "^7.23.9" + debug "^4.3.1" + globals "^11.1.0" + +"@babel/types@^7.0.0", "@babel/types@^7.20.7", "@babel/types@^7.22.15", "@babel/types@^7.22.5", "@babel/types@^7.23.0", "@babel/types@^7.23.6", "@babel/types@^7.23.9", "@babel/types@^7.3.3": + version "7.23.9" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.23.9.tgz#1dd7b59a9a2b5c87f8b41e52770b5ecbf492e002" + integrity sha512-dQjSq/7HaSjRM43FFGnv5keM2HsxpmyV1PfaSVm0nzzjwwTmjOe6J4bC8e3+pTEIgHaHj+1ZlLThRJ2auc/w1Q== + dependencies: + "@babel/helper-string-parser" "^7.23.4" + "@babel/helper-validator-identifier" "^7.22.20" + to-fast-properties "^2.0.0" + +"@bcoe/v8-coverage@^0.2.3": + version "0.2.3" + resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" + integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== + +"@chainsafe/as-sha256@^0.3.1": + version "0.3.1" + resolved "https://registry.yarnpkg.com/@chainsafe/as-sha256/-/as-sha256-0.3.1.tgz#3639df0e1435cab03f4d9870cc3ac079e57a6fc9" + integrity sha512-hldFFYuf49ed7DAakWVXSJODuq3pzJEguD8tQ7h+sGkM18vja+OFoJI9krnGmgzyuZC2ETX0NOIcCTy31v2Mtg== + +"@chainsafe/persistent-merkle-tree@^0.4.2": + version "0.4.2" + resolved "https://registry.yarnpkg.com/@chainsafe/persistent-merkle-tree/-/persistent-merkle-tree-0.4.2.tgz#4c9ee80cc57cd3be7208d98c40014ad38f36f7ff" + integrity sha512-lLO3ihKPngXLTus/L7WHKaw9PnNJWizlOF1H9NNzHP6Xvh82vzg9F2bzkXhYIFshMZ2gTCEz8tq6STe7r5NDfQ== + dependencies: + "@chainsafe/as-sha256" "^0.3.1" + +"@chainsafe/persistent-merkle-tree@^0.5.0": + version "0.5.0" + resolved "https://registry.yarnpkg.com/@chainsafe/persistent-merkle-tree/-/persistent-merkle-tree-0.5.0.tgz#2b4a62c9489a5739dedd197250d8d2f5427e9f63" + integrity sha512-l0V1b5clxA3iwQLXP40zYjyZYospQLZXzBVIhhr9kDg/1qHZfzzHw0jj4VPBijfYCArZDlPkRi1wZaV2POKeuw== + dependencies: + "@chainsafe/as-sha256" "^0.3.1" + +"@chainsafe/ssz@^0.10.0": + version "0.10.2" + resolved "https://registry.yarnpkg.com/@chainsafe/ssz/-/ssz-0.10.2.tgz#c782929e1bb25fec66ba72e75934b31fd087579e" + integrity sha512-/NL3Lh8K+0q7A3LsiFq09YXS9fPE+ead2rr7vM2QK8PLzrNsw3uqrif9bpRX5UxgeRjM+vYi+boCM3+GM4ovXg== + dependencies: + "@chainsafe/as-sha256" "^0.3.1" + "@chainsafe/persistent-merkle-tree" "^0.5.0" + +"@chainsafe/ssz@^0.9.2": + version "0.9.4" + resolved "https://registry.yarnpkg.com/@chainsafe/ssz/-/ssz-0.9.4.tgz#696a8db46d6975b600f8309ad3a12f7c0e310497" + integrity sha512-77Qtg2N1ayqs4Bg/wvnWfg5Bta7iy7IRh8XqXh7oNMeP2HBbBwx8m6yTpA8p0EHItWPEBkgZd5S5/LSlp3GXuQ== + dependencies: + "@chainsafe/as-sha256" "^0.3.1" + "@chainsafe/persistent-merkle-tree" "^0.4.2" + case "^1.6.3" + +"@colors/colors@1.6.0": + version "1.6.0" + resolved "https://registry.yarnpkg.com/@colors/colors/-/colors-1.6.0.tgz#ec6cd237440700bc23ca23087f513c75508958b0" + integrity sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA== + +"@cspotcode/source-map-support@^0.8.0": + version "0.8.1" + resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz#00629c35a688e05a88b1cda684fb9d5e73f000a1" + integrity sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw== + dependencies: + "@jridgewell/trace-mapping" "0.3.9" + +"@dabh/diagnostics@^2.0.2": + version "2.0.3" + resolved "https://registry.yarnpkg.com/@dabh/diagnostics/-/diagnostics-2.0.3.tgz#7f7e97ee9a725dffc7808d93668cc984e1dc477a" + integrity sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA== + dependencies: + colorspace "1.1.x" + enabled "2.0.x" + kuler "^2.0.0" + +"@esbuild/aix-ppc64@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.19.12.tgz#d1bc06aedb6936b3b6d313bf809a5a40387d2b7f" + integrity sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA== + +"@esbuild/android-arm64@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.19.12.tgz#7ad65a36cfdb7e0d429c353e00f680d737c2aed4" + integrity sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA== + +"@esbuild/android-arm@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.19.12.tgz#b0c26536f37776162ca8bde25e42040c203f2824" + integrity sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w== + +"@esbuild/android-x64@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.19.12.tgz#cb13e2211282012194d89bf3bfe7721273473b3d" + integrity sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew== + +"@esbuild/darwin-arm64@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.19.12.tgz#cbee41e988020d4b516e9d9e44dd29200996275e" + integrity sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g== + +"@esbuild/darwin-x64@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.19.12.tgz#e37d9633246d52aecf491ee916ece709f9d5f4cd" + integrity sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A== + +"@esbuild/freebsd-arm64@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.12.tgz#1ee4d8b682ed363b08af74d1ea2b2b4dbba76487" + integrity sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA== + +"@esbuild/freebsd-x64@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.19.12.tgz#37a693553d42ff77cd7126764b535fb6cc28a11c" + integrity sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg== + +"@esbuild/linux-arm64@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.19.12.tgz#be9b145985ec6c57470e0e051d887b09dddb2d4b" + integrity sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA== + +"@esbuild/linux-arm@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.19.12.tgz#207ecd982a8db95f7b5279207d0ff2331acf5eef" + integrity sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w== + +"@esbuild/linux-ia32@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.19.12.tgz#d0d86b5ca1562523dc284a6723293a52d5860601" + integrity sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA== + +"@esbuild/linux-loong64@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.19.12.tgz#9a37f87fec4b8408e682b528391fa22afd952299" + integrity sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA== + +"@esbuild/linux-mips64el@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.19.12.tgz#4ddebd4e6eeba20b509d8e74c8e30d8ace0b89ec" + integrity sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w== + +"@esbuild/linux-ppc64@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.19.12.tgz#adb67dadb73656849f63cd522f5ecb351dd8dee8" + integrity sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg== + +"@esbuild/linux-riscv64@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.19.12.tgz#11bc0698bf0a2abf8727f1c7ace2112612c15adf" + integrity sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg== + +"@esbuild/linux-s390x@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.19.12.tgz#e86fb8ffba7c5c92ba91fc3b27ed5a70196c3cc8" + integrity sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg== + +"@esbuild/linux-x64@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.19.12.tgz#5f37cfdc705aea687dfe5dfbec086a05acfe9c78" + integrity sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg== + +"@esbuild/netbsd-x64@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.19.12.tgz#29da566a75324e0d0dd7e47519ba2f7ef168657b" + integrity sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA== + +"@esbuild/openbsd-x64@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.19.12.tgz#306c0acbdb5a99c95be98bdd1d47c916e7dc3ff0" + integrity sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw== + +"@esbuild/sunos-x64@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.19.12.tgz#0933eaab9af8b9b2c930236f62aae3fc593faf30" + integrity sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA== + +"@esbuild/win32-arm64@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.19.12.tgz#773bdbaa1971b36db2f6560088639ccd1e6773ae" + integrity sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A== + +"@esbuild/win32-ia32@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.19.12.tgz#000516cad06354cc84a73f0943a4aa690ef6fd67" + integrity sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ== + +"@esbuild/win32-x64@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.19.12.tgz#c57c8afbb4054a3ab8317591a0b7320360b444ae" + integrity sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA== + +"@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.4.0": + version "4.4.0" + resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz#a23514e8fb9af1269d5f7788aa556798d61c6b59" + integrity sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA== + dependencies: + eslint-visitor-keys "^3.3.0" + +"@eslint-community/regexpp@^4.5.1", "@eslint-community/regexpp@^4.6.1": + version "4.10.0" + resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.10.0.tgz#548f6de556857c8bb73bbee70c35dc82a2e74d63" + integrity sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA== + +"@eslint/eslintrc@^2.1.4": + version "2.1.4" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.1.4.tgz#388a269f0f25c1b6adc317b5a2c55714894c70ad" + integrity sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ== + dependencies: + ajv "^6.12.4" + debug "^4.3.2" + espree "^9.6.0" + globals "^13.19.0" + ignore "^5.2.0" + import-fresh "^3.2.1" + js-yaml "^4.1.0" + minimatch "^3.1.2" + strip-json-comments "^3.1.1" + +"@eslint/js@8.56.0": + version "8.56.0" + resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.56.0.tgz#ef20350fec605a7f7035a01764731b2de0f3782b" + integrity sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A== + +"@ethereumjs/rlp@^4.0.1": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@ethereumjs/rlp/-/rlp-4.0.1.tgz#626fabfd9081baab3d0a3074b0c7ecaf674aaa41" + integrity sha512-tqsQiBQDQdmPWE1xkkBq4rlSW5QZpLOUJ5RJh2/9fug+q9tnUhuZoVLk7s0scUIKTOzEtR72DFBXI4WiZcMpvw== + +"@ethereumjs/util@^8.1.0": + version "8.1.0" + resolved "https://registry.yarnpkg.com/@ethereumjs/util/-/util-8.1.0.tgz#299df97fb6b034e0577ce9f94c7d9d1004409ed4" + integrity sha512-zQ0IqbdX8FZ9aw11vP+dZkKDkS+kgIvQPHnSAXzP9pLu+Rfu3D3XEeLbicvoXJTYnhZiPmsZUxgdzXwNKxRPbA== + dependencies: + "@ethereumjs/rlp" "^4.0.1" + ethereum-cryptography "^2.0.0" + micro-ftch "^0.3.1" + +"@ethersproject/abi@5.7.0", "@ethersproject/abi@^5.1.2", "@ethersproject/abi@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/abi/-/abi-5.7.0.tgz#b3f3e045bbbeed1af3947335c247ad625a44e449" + integrity sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA== + dependencies: + "@ethersproject/address" "^5.7.0" + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/constants" "^5.7.0" + "@ethersproject/hash" "^5.7.0" + "@ethersproject/keccak256" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/strings" "^5.7.0" + +"@ethersproject/abstract-provider@5.7.0", "@ethersproject/abstract-provider@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/abstract-provider/-/abstract-provider-5.7.0.tgz#b0a8550f88b6bf9d51f90e4795d48294630cb9ef" + integrity sha512-R41c9UkchKCpAqStMYUpdunjo3pkEvZC3FAwZn5S5MGbXoMQOHIdHItezTETxAO5bevtMApSyEhn9+CHcDsWBw== + dependencies: + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/networks" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/transactions" "^5.7.0" + "@ethersproject/web" "^5.7.0" + +"@ethersproject/abstract-signer@5.7.0", "@ethersproject/abstract-signer@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/abstract-signer/-/abstract-signer-5.7.0.tgz#13f4f32117868452191a4649723cb086d2b596b2" + integrity sha512-a16V8bq1/Cz+TGCkE2OPMTOUDLS3grCpdjoJCYNnVBbdYEMSgKrU0+B90s8b6H+ByYTBZN7a3g76jdIJi7UfKQ== + dependencies: + "@ethersproject/abstract-provider" "^5.7.0" + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + +"@ethersproject/address@5.7.0", "@ethersproject/address@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/address/-/address-5.7.0.tgz#19b56c4d74a3b0a46bfdbb6cfcc0a153fc697f37" + integrity sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA== + dependencies: + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/keccak256" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/rlp" "^5.7.0" + +"@ethersproject/base64@5.7.0", "@ethersproject/base64@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/base64/-/base64-5.7.0.tgz#ac4ee92aa36c1628173e221d0d01f53692059e1c" + integrity sha512-Dr8tcHt2mEbsZr/mwTPIQAf3Ai0Bks/7gTw9dSqk1mQvhW3XvRlmDJr/4n+wg1JmCl16NZue17CDh8xb/vZ0sQ== + dependencies: + "@ethersproject/bytes" "^5.7.0" + +"@ethersproject/basex@5.7.0", "@ethersproject/basex@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/basex/-/basex-5.7.0.tgz#97034dc7e8938a8ca943ab20f8a5e492ece4020b" + integrity sha512-ywlh43GwZLv2Voc2gQVTKBoVQ1mti3d8HK5aMxsfu/nRDnMmNqaSJ3r3n85HBByT8OpoY96SXM1FogC533T4zw== + dependencies: + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + +"@ethersproject/bignumber@5.7.0", "@ethersproject/bignumber@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/bignumber/-/bignumber-5.7.0.tgz#e2f03837f268ba655ffba03a57853e18a18dc9c2" + integrity sha512-n1CAdIHRWjSucQO3MC1zPSVgV/6dy/fjL9pMrPP9peL+QxEg9wOsVqwD4+818B6LUEtaXzVHQiuivzRoxPxUGw== + dependencies: + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + bn.js "^5.2.1" + +"@ethersproject/bytes@5.7.0", "@ethersproject/bytes@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/bytes/-/bytes-5.7.0.tgz#a00f6ea8d7e7534d6d87f47188af1148d71f155d" + integrity sha512-nsbxwgFXWh9NyYWo+U8atvmMsSdKJprTcICAkvbBffT75qDocbuggBU0SJiVK2MuTrp0q+xvLkTnGMPK1+uA9A== + dependencies: + "@ethersproject/logger" "^5.7.0" + +"@ethersproject/constants@5.7.0", "@ethersproject/constants@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/constants/-/constants-5.7.0.tgz#df80a9705a7e08984161f09014ea012d1c75295e" + integrity sha512-DHI+y5dBNvkpYUMiRQyxRBYBefZkJfo70VUkUAsRjcPs47muV9evftfZ0PJVCXYbAiCgght0DtcF9srFQmIgWA== + dependencies: + "@ethersproject/bignumber" "^5.7.0" + +"@ethersproject/contracts@5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/contracts/-/contracts-5.7.0.tgz#c305e775abd07e48aa590e1a877ed5c316f8bd1e" + integrity sha512-5GJbzEU3X+d33CdfPhcyS+z8MzsTrBGk/sc+G+59+tPa9yFkl6HQ9D6L0QMgNTA9q8dT0XKxxkyp883XsQvbbg== + dependencies: + "@ethersproject/abi" "^5.7.0" + "@ethersproject/abstract-provider" "^5.7.0" + "@ethersproject/abstract-signer" "^5.7.0" + "@ethersproject/address" "^5.7.0" + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/constants" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/transactions" "^5.7.0" + +"@ethersproject/hash@5.7.0", "@ethersproject/hash@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/hash/-/hash-5.7.0.tgz#eb7aca84a588508369562e16e514b539ba5240a7" + integrity sha512-qX5WrQfnah1EFnO5zJv1v46a8HW0+E5xuBBDTwMFZLuVTx0tbU2kkx15NqdjxecrLGatQN9FGQKpb1FKdHCt+g== + dependencies: + "@ethersproject/abstract-signer" "^5.7.0" + "@ethersproject/address" "^5.7.0" + "@ethersproject/base64" "^5.7.0" + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/keccak256" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/strings" "^5.7.0" + +"@ethersproject/hdnode@5.7.0", "@ethersproject/hdnode@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/hdnode/-/hdnode-5.7.0.tgz#e627ddc6b466bc77aebf1a6b9e47405ca5aef9cf" + integrity sha512-OmyYo9EENBPPf4ERhR7oj6uAtUAhYGqOnIS+jE5pTXvdKBS99ikzq1E7Iv0ZQZ5V36Lqx1qZLeak0Ra16qpeOg== + dependencies: + "@ethersproject/abstract-signer" "^5.7.0" + "@ethersproject/basex" "^5.7.0" + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/pbkdf2" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/sha2" "^5.7.0" + "@ethersproject/signing-key" "^5.7.0" + "@ethersproject/strings" "^5.7.0" + "@ethersproject/transactions" "^5.7.0" + "@ethersproject/wordlists" "^5.7.0" + +"@ethersproject/json-wallets@5.7.0", "@ethersproject/json-wallets@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/json-wallets/-/json-wallets-5.7.0.tgz#5e3355287b548c32b368d91014919ebebddd5360" + integrity sha512-8oee5Xgu6+RKgJTkvEMl2wDgSPSAQ9MB/3JYjFV9jlKvcYHUXZC+cQp0njgmxdHkYWn8s6/IqIZYm0YWCjO/0g== + dependencies: + "@ethersproject/abstract-signer" "^5.7.0" + "@ethersproject/address" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/hdnode" "^5.7.0" + "@ethersproject/keccak256" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/pbkdf2" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/random" "^5.7.0" + "@ethersproject/strings" "^5.7.0" + "@ethersproject/transactions" "^5.7.0" + aes-js "3.0.0" + scrypt-js "3.0.1" + +"@ethersproject/keccak256@5.7.0", "@ethersproject/keccak256@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/keccak256/-/keccak256-5.7.0.tgz#3186350c6e1cd6aba7940384ec7d6d9db01f335a" + integrity sha512-2UcPboeL/iW+pSg6vZ6ydF8tCnv3Iu/8tUmLLzWWGzxWKFFqOBQFLo6uLUv6BDrLgCDfN28RJ/wtByx+jZ4KBg== + dependencies: + "@ethersproject/bytes" "^5.7.0" + js-sha3 "0.8.0" + +"@ethersproject/logger@5.7.0", "@ethersproject/logger@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/logger/-/logger-5.7.0.tgz#6ce9ae168e74fecf287be17062b590852c311892" + integrity sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig== + +"@ethersproject/networks@5.7.1", "@ethersproject/networks@^5.7.0": + version "5.7.1" + resolved "https://registry.yarnpkg.com/@ethersproject/networks/-/networks-5.7.1.tgz#118e1a981d757d45ccea6bb58d9fd3d9db14ead6" + integrity sha512-n/MufjFYv3yFcUyfhnXotyDlNdFb7onmkSy8aQERi2PjNcnWQ66xXxa3XlS8nCcA8aJKJjIIMNJTC7tu80GwpQ== + dependencies: + "@ethersproject/logger" "^5.7.0" + +"@ethersproject/pbkdf2@5.7.0", "@ethersproject/pbkdf2@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/pbkdf2/-/pbkdf2-5.7.0.tgz#d2267d0a1f6e123f3771007338c47cccd83d3102" + integrity sha512-oR/dBRZR6GTyaofd86DehG72hY6NpAjhabkhxgr3X2FpJtJuodEl2auADWBZfhDHgVCbu3/H/Ocq2uC6dpNjjw== + dependencies: + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/sha2" "^5.7.0" + +"@ethersproject/properties@5.7.0", "@ethersproject/properties@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/properties/-/properties-5.7.0.tgz#a6e12cb0439b878aaf470f1902a176033067ed30" + integrity sha512-J87jy8suntrAkIZtecpxEPxY//szqr1mlBaYlQ0r4RCaiD2hjheqF9s1LVE8vVuJCXisjIP+JgtK/Do54ej4Sw== + dependencies: + "@ethersproject/logger" "^5.7.0" + +"@ethersproject/providers@5.7.2", "@ethersproject/providers@^5.7.1", "@ethersproject/providers@^5.7.2": + version "5.7.2" + resolved "https://registry.yarnpkg.com/@ethersproject/providers/-/providers-5.7.2.tgz#f8b1a4f275d7ce58cf0a2eec222269a08beb18cb" + integrity sha512-g34EWZ1WWAVgr4aptGlVBF8mhl3VWjv+8hoAnzStu8Ah22VHBsuGzP17eb6xDVRzw895G4W7vvx60lFFur/1Rg== + dependencies: + "@ethersproject/abstract-provider" "^5.7.0" + "@ethersproject/abstract-signer" "^5.7.0" + "@ethersproject/address" "^5.7.0" + "@ethersproject/base64" "^5.7.0" + "@ethersproject/basex" "^5.7.0" + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/constants" "^5.7.0" + "@ethersproject/hash" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/networks" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/random" "^5.7.0" + "@ethersproject/rlp" "^5.7.0" + "@ethersproject/sha2" "^5.7.0" + "@ethersproject/strings" "^5.7.0" + "@ethersproject/transactions" "^5.7.0" + "@ethersproject/web" "^5.7.0" + bech32 "1.1.4" + ws "7.4.6" + +"@ethersproject/random@5.7.0", "@ethersproject/random@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/random/-/random-5.7.0.tgz#af19dcbc2484aae078bb03656ec05df66253280c" + integrity sha512-19WjScqRA8IIeWclFme75VMXSBvi4e6InrUNuaR4s5pTF2qNhcGdCUwdxUVGtDDqC00sDLCO93jPQoDUH4HVmQ== + dependencies: + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + +"@ethersproject/rlp@5.7.0", "@ethersproject/rlp@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/rlp/-/rlp-5.7.0.tgz#de39e4d5918b9d74d46de93af80b7685a9c21304" + integrity sha512-rBxzX2vK8mVF7b0Tol44t5Tb8gomOHkj5guL+HhzQ1yBh/ydjGnpw6at+X6Iw0Kp3OzzzkcKp8N9r0W4kYSs9w== + dependencies: + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + +"@ethersproject/sha2@5.7.0", "@ethersproject/sha2@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/sha2/-/sha2-5.7.0.tgz#9a5f7a7824ef784f7f7680984e593a800480c9fb" + integrity sha512-gKlH42riwb3KYp0reLsFTokByAKoJdgFCwI+CCiX/k+Jm2mbNs6oOaCjYQSlI1+XBVejwH2KrmCbMAT/GnRDQw== + dependencies: + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + hash.js "1.1.7" + +"@ethersproject/signing-key@5.7.0", "@ethersproject/signing-key@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/signing-key/-/signing-key-5.7.0.tgz#06b2df39411b00bc57c7c09b01d1e41cf1b16ab3" + integrity sha512-MZdy2nL3wO0u7gkB4nA/pEf8lu1TlFswPNmy8AiYkfKTdO6eXBJyUdmHO/ehm/htHw9K/qF8ujnTyUAD+Ry54Q== + dependencies: + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + bn.js "^5.2.1" + elliptic "6.5.4" + hash.js "1.1.7" + +"@ethersproject/solidity@5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/solidity/-/solidity-5.7.0.tgz#5e9c911d8a2acce2a5ebb48a5e2e0af20b631cb8" + integrity sha512-HmabMd2Dt/raavyaGukF4XxizWKhKQ24DoLtdNbBmNKUOPqwjsKQSdV9GQtj9CBEea9DlzETlVER1gYeXXBGaA== + dependencies: + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/keccak256" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/sha2" "^5.7.0" + "@ethersproject/strings" "^5.7.0" + +"@ethersproject/strings@5.7.0", "@ethersproject/strings@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/strings/-/strings-5.7.0.tgz#54c9d2a7c57ae8f1205c88a9d3a56471e14d5ed2" + integrity sha512-/9nu+lj0YswRNSH0NXYqrh8775XNyEdUQAuf3f+SmOrnVewcJ5SBNAjF7lpgehKi4abvNNXyf+HX86czCdJ8Mg== + dependencies: + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/constants" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + +"@ethersproject/transactions@5.7.0", "@ethersproject/transactions@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/transactions/-/transactions-5.7.0.tgz#91318fc24063e057885a6af13fdb703e1f993d3b" + integrity sha512-kmcNicCp1lp8qanMTC3RIikGgoJ80ztTyvtsFvCYpSCfkjhD0jZ2LOrnbcuxuToLIUYYf+4XwD1rP+B/erDIhQ== + dependencies: + "@ethersproject/address" "^5.7.0" + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/constants" "^5.7.0" + "@ethersproject/keccak256" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/rlp" "^5.7.0" + "@ethersproject/signing-key" "^5.7.0" + +"@ethersproject/units@5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/units/-/units-5.7.0.tgz#637b563d7e14f42deeee39245275d477aae1d8b1" + integrity sha512-pD3xLMy3SJu9kG5xDGI7+xhTEmGXlEqXU4OfNapmfnxLVY4EMSSRp7j1k7eezutBPH7RBN/7QPnwR7hzNlEFeg== + dependencies: + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/constants" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + +"@ethersproject/wallet@5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/wallet/-/wallet-5.7.0.tgz#4e5d0790d96fe21d61d38fb40324e6c7ef350b2d" + integrity sha512-MhmXlJXEJFBFVKrDLB4ZdDzxcBxQ3rLyCkhNqVu3CDYvR97E+8r01UgrI+TI99Le+aYm/in/0vp86guJuM7FCA== + dependencies: + "@ethersproject/abstract-provider" "^5.7.0" + "@ethersproject/abstract-signer" "^5.7.0" + "@ethersproject/address" "^5.7.0" + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/hash" "^5.7.0" + "@ethersproject/hdnode" "^5.7.0" + "@ethersproject/json-wallets" "^5.7.0" + "@ethersproject/keccak256" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/random" "^5.7.0" + "@ethersproject/signing-key" "^5.7.0" + "@ethersproject/transactions" "^5.7.0" + "@ethersproject/wordlists" "^5.7.0" + +"@ethersproject/web@5.7.1", "@ethersproject/web@^5.7.0": + version "5.7.1" + resolved "https://registry.yarnpkg.com/@ethersproject/web/-/web-5.7.1.tgz#de1f285b373149bee5928f4eb7bcb87ee5fbb4ae" + integrity sha512-Gueu8lSvyjBWL4cYsWsjh6MtMwM0+H4HvqFPZfB6dV8ctbP9zFAO73VG1cMWae0FLPCtz0peKPpZY8/ugJJX2w== + dependencies: + "@ethersproject/base64" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/strings" "^5.7.0" + +"@ethersproject/wordlists@5.7.0", "@ethersproject/wordlists@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/wordlists/-/wordlists-5.7.0.tgz#8fb2c07185d68c3e09eb3bfd6e779ba2774627f5" + integrity sha512-S2TFNJNfHWVHNE6cNDjbVlZ6MgE17MIxMbMg2zv3wn+3XSJGosL1m9ZVv3GXCf/2ymSsQ+hRI5IzoMJTG6aoVA== + dependencies: + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/hash" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/strings" "^5.7.0" + +"@fastify/busboy@^2.0.0": + version "2.1.0" + resolved "https://registry.yarnpkg.com/@fastify/busboy/-/busboy-2.1.0.tgz#0709e9f4cb252351c609c6e6d8d6779a8d25edff" + integrity sha512-+KpH+QxZU7O4675t3mnkQKcZZg56u+K/Ct2K+N2AZYNVK8kyeo/bI18tI8aPm3tvNNRyTWfj6s5tnGNlcbQRsA== + +"@gar/promisify@^1.0.1", "@gar/promisify@^1.1.3": + version "1.1.3" + resolved "https://registry.yarnpkg.com/@gar/promisify/-/promisify-1.1.3.tgz#555193ab2e3bb3b6adc3d551c9c030d9e860daf6" + integrity sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw== + +"@humanwhocodes/config-array@^0.11.13": + version "0.11.14" + resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.14.tgz#d78e481a039f7566ecc9660b4ea7fe6b1fec442b" + integrity sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg== + dependencies: + "@humanwhocodes/object-schema" "^2.0.2" + debug "^4.3.1" + minimatch "^3.0.5" + +"@humanwhocodes/module-importer@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" + integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== + +"@humanwhocodes/object-schema@^2.0.2": + version "2.0.2" + resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-2.0.2.tgz#d9fae00a2d5cb40f92cfe64b47ad749fbc38f917" + integrity sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw== + +"@hutson/parse-repository-url@^3.0.0": + version "3.0.2" + resolved "https://registry.yarnpkg.com/@hutson/parse-repository-url/-/parse-repository-url-3.0.2.tgz#98c23c950a3d9b6c8f0daed06da6c3af06981340" + integrity sha512-H9XAx3hc0BQHY6l+IFSWHDySypcXsvsuLhgYLUGywmJ5pswRVQJUHpOsobnLYp2ZUaUlKiKDrgWWhosOwAEM8Q== + +"@isaacs/cliui@^8.0.2": + version "8.0.2" + resolved "https://registry.yarnpkg.com/@isaacs/cliui/-/cliui-8.0.2.tgz#b37667b7bc181c168782259bab42474fbf52b550" + integrity sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA== + dependencies: + string-width "^5.1.2" + string-width-cjs "npm:string-width@^4.2.0" + strip-ansi "^7.0.1" + strip-ansi-cjs "npm:strip-ansi@^6.0.1" + wrap-ansi "^8.1.0" + wrap-ansi-cjs "npm:wrap-ansi@^7.0.0" + +"@istanbuljs/load-nyc-config@^1.0.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz#fd3db1d59ecf7cf121e80650bb86712f9b55eced" + integrity sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ== + dependencies: + camelcase "^5.3.1" + find-up "^4.1.0" + get-package-type "^0.1.0" + js-yaml "^3.13.1" + resolve-from "^5.0.0" + +"@istanbuljs/schema@^0.1.2": + version "0.1.3" + resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98" + integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== + +"@jest/console@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/console/-/console-29.7.0.tgz#cd4822dbdb84529265c5a2bdb529a3c9cc950ffc" + integrity sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg== + dependencies: + "@jest/types" "^29.6.3" + "@types/node" "*" + chalk "^4.0.0" + jest-message-util "^29.7.0" + jest-util "^29.7.0" + slash "^3.0.0" + +"@jest/core@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/core/-/core-29.7.0.tgz#b6cccc239f30ff36609658c5a5e2291757ce448f" + integrity sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg== + dependencies: + "@jest/console" "^29.7.0" + "@jest/reporters" "^29.7.0" + "@jest/test-result" "^29.7.0" + "@jest/transform" "^29.7.0" + "@jest/types" "^29.6.3" + "@types/node" "*" + ansi-escapes "^4.2.1" + chalk "^4.0.0" + ci-info "^3.2.0" + exit "^0.1.2" + graceful-fs "^4.2.9" + jest-changed-files "^29.7.0" + jest-config "^29.7.0" + jest-haste-map "^29.7.0" + jest-message-util "^29.7.0" + jest-regex-util "^29.6.3" + jest-resolve "^29.7.0" + jest-resolve-dependencies "^29.7.0" + jest-runner "^29.7.0" + jest-runtime "^29.7.0" + jest-snapshot "^29.7.0" + jest-util "^29.7.0" + jest-validate "^29.7.0" + jest-watcher "^29.7.0" + micromatch "^4.0.4" + pretty-format "^29.7.0" + slash "^3.0.0" + strip-ansi "^6.0.0" + +"@jest/environment@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-29.7.0.tgz#24d61f54ff1f786f3cd4073b4b94416383baf2a7" + integrity sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw== + dependencies: + "@jest/fake-timers" "^29.7.0" + "@jest/types" "^29.6.3" + "@types/node" "*" + jest-mock "^29.7.0" + +"@jest/expect-utils@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/expect-utils/-/expect-utils-29.7.0.tgz#023efe5d26a8a70f21677d0a1afc0f0a44e3a1c6" + integrity sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA== + dependencies: + jest-get-type "^29.6.3" + +"@jest/expect@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/expect/-/expect-29.7.0.tgz#76a3edb0cb753b70dfbfe23283510d3d45432bf2" + integrity sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ== + dependencies: + expect "^29.7.0" + jest-snapshot "^29.7.0" + +"@jest/fake-timers@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-29.7.0.tgz#fd91bf1fffb16d7d0d24a426ab1a47a49881a565" + integrity sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ== + dependencies: + "@jest/types" "^29.6.3" + "@sinonjs/fake-timers" "^10.0.2" + "@types/node" "*" + jest-message-util "^29.7.0" + jest-mock "^29.7.0" + jest-util "^29.7.0" + +"@jest/globals@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-29.7.0.tgz#8d9290f9ec47ff772607fa864ca1d5a2efae1d4d" + integrity sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ== + dependencies: + "@jest/environment" "^29.7.0" + "@jest/expect" "^29.7.0" + "@jest/types" "^29.6.3" + jest-mock "^29.7.0" + +"@jest/reporters@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-29.7.0.tgz#04b262ecb3b8faa83b0b3d321623972393e8f4c7" + integrity sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg== + dependencies: + "@bcoe/v8-coverage" "^0.2.3" + "@jest/console" "^29.7.0" + "@jest/test-result" "^29.7.0" + "@jest/transform" "^29.7.0" + "@jest/types" "^29.6.3" + "@jridgewell/trace-mapping" "^0.3.18" + "@types/node" "*" + chalk "^4.0.0" + collect-v8-coverage "^1.0.0" + exit "^0.1.2" + glob "^7.1.3" + graceful-fs "^4.2.9" + istanbul-lib-coverage "^3.0.0" + istanbul-lib-instrument "^6.0.0" + istanbul-lib-report "^3.0.0" + istanbul-lib-source-maps "^4.0.0" + istanbul-reports "^3.1.3" + jest-message-util "^29.7.0" + jest-util "^29.7.0" + jest-worker "^29.7.0" + slash "^3.0.0" + string-length "^4.0.1" + strip-ansi "^6.0.0" + v8-to-istanbul "^9.0.1" + +"@jest/schemas@^29.6.3": + version "29.6.3" + resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-29.6.3.tgz#430b5ce8a4e0044a7e3819663305a7b3091c8e03" + integrity sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA== + dependencies: + "@sinclair/typebox" "^0.27.8" + +"@jest/source-map@^29.6.3": + version "29.6.3" + resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-29.6.3.tgz#d90ba772095cf37a34a5eb9413f1b562a08554c4" + integrity sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw== + dependencies: + "@jridgewell/trace-mapping" "^0.3.18" + callsites "^3.0.0" + graceful-fs "^4.2.9" + +"@jest/test-result@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-29.7.0.tgz#8db9a80aa1a097bb2262572686734baed9b1657c" + integrity sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA== + dependencies: + "@jest/console" "^29.7.0" + "@jest/types" "^29.6.3" + "@types/istanbul-lib-coverage" "^2.0.0" + collect-v8-coverage "^1.0.0" + +"@jest/test-sequencer@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz#6cef977ce1d39834a3aea887a1726628a6f072ce" + integrity sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw== + dependencies: + "@jest/test-result" "^29.7.0" + graceful-fs "^4.2.9" + jest-haste-map "^29.7.0" + slash "^3.0.0" + +"@jest/transform@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-29.7.0.tgz#df2dd9c346c7d7768b8a06639994640c642e284c" + integrity sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw== + dependencies: + "@babel/core" "^7.11.6" + "@jest/types" "^29.6.3" + "@jridgewell/trace-mapping" "^0.3.18" + babel-plugin-istanbul "^6.1.1" + chalk "^4.0.0" + convert-source-map "^2.0.0" + fast-json-stable-stringify "^2.1.0" + graceful-fs "^4.2.9" + jest-haste-map "^29.7.0" + jest-regex-util "^29.6.3" + jest-util "^29.7.0" + micromatch "^4.0.4" + pirates "^4.0.4" + slash "^3.0.0" + write-file-atomic "^4.0.2" + +"@jest/types@^29.6.3": + version "29.6.3" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-29.6.3.tgz#1131f8cf634e7e84c5e77bab12f052af585fba59" + integrity sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw== + dependencies: + "@jest/schemas" "^29.6.3" + "@types/istanbul-lib-coverage" "^2.0.0" + "@types/istanbul-reports" "^3.0.0" + "@types/node" "*" + "@types/yargs" "^17.0.8" + chalk "^4.0.0" + +"@jridgewell/gen-mapping@^0.3.0", "@jridgewell/gen-mapping@^0.3.2": + version "0.3.3" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz#7e02e6eb5df901aaedb08514203b096614024098" + integrity sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ== + dependencies: + "@jridgewell/set-array" "^1.0.1" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@jridgewell/trace-mapping" "^0.3.9" + +"@jridgewell/resolve-uri@^3.0.3", "@jridgewell/resolve-uri@^3.1.0": + version "3.1.1" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz#c08679063f279615a3326583ba3a90d1d82cc721" + integrity sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA== + +"@jridgewell/set-array@^1.0.1": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" + integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== + +"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14": + version "1.4.15" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" + integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== + +"@jridgewell/trace-mapping@0.3.9": + version "0.3.9" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz#6534fd5933a53ba7cbf3a17615e273a0d1273ff9" + integrity sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ== + dependencies: + "@jridgewell/resolve-uri" "^3.0.3" + "@jridgewell/sourcemap-codec" "^1.4.10" + +"@jridgewell/trace-mapping@^0.3.12", "@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.18", "@jridgewell/trace-mapping@^0.3.9": + version "0.3.22" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.22.tgz#72a621e5de59f5f1ef792d0793a82ee20f645e4c" + integrity sha512-Wf963MzWtA2sjrNt+g18IAln9lKnlRp+K2eH4jjIoF1wYeq3aMREpG09xhlhdzS0EjwU7qmUJYangWa+151vZw== + dependencies: + "@jridgewell/resolve-uri" "^3.1.0" + "@jridgewell/sourcemap-codec" "^1.4.14" + +"@lerna/child-process@7.4.2": + version "7.4.2" + resolved "https://registry.yarnpkg.com/@lerna/child-process/-/child-process-7.4.2.tgz#a2fd013ac2150dc288270d3e0d0b850c06bec511" + integrity sha512-je+kkrfcvPcwL5Tg8JRENRqlbzjdlZXyaR88UcnCdNW0AJ1jX9IfHRys1X7AwSroU2ug8ESNC+suoBw1vX833Q== + dependencies: + chalk "^4.1.0" + execa "^5.0.0" + strong-log-transformer "^2.1.0" + +"@lerna/create@7.4.2": + version "7.4.2" + resolved "https://registry.yarnpkg.com/@lerna/create/-/create-7.4.2.tgz#f845fad1480e46555af98bd39af29571605dddc9" + integrity sha512-1wplFbQ52K8E/unnqB0Tq39Z4e+NEoNrpovEnl6GpsTUrC6WDp8+w0Le2uCBV0hXyemxChduCkLz4/y1H1wTeg== + dependencies: + "@lerna/child-process" "7.4.2" + "@npmcli/run-script" "6.0.2" + "@nx/devkit" ">=16.5.1 < 17" + "@octokit/plugin-enterprise-rest" "6.0.1" + "@octokit/rest" "19.0.11" + byte-size "8.1.1" + chalk "4.1.0" + clone-deep "4.0.1" + cmd-shim "6.0.1" + columnify "1.6.0" + conventional-changelog-core "5.0.1" + conventional-recommended-bump "7.0.1" + cosmiconfig "^8.2.0" + dedent "0.7.0" + execa "5.0.0" + fs-extra "^11.1.1" + get-stream "6.0.0" + git-url-parse "13.1.0" + glob-parent "5.1.2" + globby "11.1.0" + graceful-fs "4.2.11" + has-unicode "2.0.1" + ini "^1.3.8" + init-package-json "5.0.0" + inquirer "^8.2.4" + is-ci "3.0.1" + is-stream "2.0.0" + js-yaml "4.1.0" + libnpmpublish "7.3.0" + load-json-file "6.2.0" + lodash "^4.17.21" + make-dir "4.0.0" + minimatch "3.0.5" + multimatch "5.0.0" + node-fetch "2.6.7" + npm-package-arg "8.1.1" + npm-packlist "5.1.1" + npm-registry-fetch "^14.0.5" + npmlog "^6.0.2" + nx ">=16.5.1 < 17" + p-map "4.0.0" + p-map-series "2.1.0" + p-queue "6.6.2" + p-reduce "^2.1.0" + pacote "^15.2.0" + pify "5.0.0" + read-cmd-shim "4.0.0" + read-package-json "6.0.4" + resolve-from "5.0.0" + rimraf "^4.4.1" + semver "^7.3.4" + signal-exit "3.0.7" + slash "^3.0.0" + ssri "^9.0.1" + strong-log-transformer "2.1.0" + tar "6.1.11" + temp-dir "1.0.0" + upath "2.0.1" + uuid "^9.0.0" + validate-npm-package-license "^3.0.4" + validate-npm-package-name "5.0.0" + write-file-atomic "5.0.1" + write-pkg "4.0.0" + yargs "16.2.0" + yargs-parser "20.2.4" + +"@metamask/eth-sig-util@^4.0.0": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@metamask/eth-sig-util/-/eth-sig-util-4.0.1.tgz#3ad61f6ea9ad73ba5b19db780d40d9aae5157088" + integrity sha512-tghyZKLHZjcdlDqCA3gNZmLeR0XvOE9U1qoQO9ohyAZT6Pya+H9vkBPcsyXytmYLNgVoin7CKCmweo/R43V+tQ== + dependencies: + ethereumjs-abi "^0.6.8" + ethereumjs-util "^6.2.1" + ethjs-util "^0.1.6" + tweetnacl "^1.0.3" + tweetnacl-util "^0.15.1" + +"@noble/curves@1.2.0", "@noble/curves@~1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@noble/curves/-/curves-1.2.0.tgz#92d7e12e4e49b23105a2555c6984d41733d65c35" + integrity sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw== + dependencies: + "@noble/hashes" "1.3.2" + +"@noble/curves@1.3.0", "@noble/curves@~1.3.0": + version "1.3.0" + resolved "https://registry.yarnpkg.com/@noble/curves/-/curves-1.3.0.tgz#01be46da4fd195822dab821e72f71bf4aeec635e" + integrity sha512-t01iSXPuN+Eqzb4eBX0S5oubSqXbK/xXa1Ne18Hj8f9pStxztHCE2gfboSp/dZRLSqfuLpRK2nDXDK+W9puocA== + dependencies: + "@noble/hashes" "1.3.3" + +"@noble/hashes@1.2.0", "@noble/hashes@~1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.2.0.tgz#a3150eeb09cc7ab207ebf6d7b9ad311a9bdbed12" + integrity sha512-FZfhjEDbT5GRswV3C6uvLPHMiVD6lQBmpoX5+eSiPaMTXte/IKqI5dykDxzZB/WBeK/CDuQRBWarPdi3FNY2zQ== + +"@noble/hashes@1.3.2": + version "1.3.2" + resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.3.2.tgz#6f26dbc8fbc7205873ce3cee2f690eba0d421b39" + integrity sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ== + +"@noble/hashes@1.3.3", "@noble/hashes@~1.3.0", "@noble/hashes@~1.3.2": + version "1.3.3" + resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.3.3.tgz#39908da56a4adc270147bb07968bf3b16cfe1699" + integrity sha512-V7/fPHgl+jsVPXqqeOzT8egNj2iBIVt+ECeMMG8TdcnTikP3oaBtUVqpT/gYCR68aEBJSF+XbYUxStjbFMqIIA== + +"@noble/secp256k1@1.7.1", "@noble/secp256k1@~1.7.0": + version "1.7.1" + resolved "https://registry.yarnpkg.com/@noble/secp256k1/-/secp256k1-1.7.1.tgz#b251c70f824ce3ca7f8dc3df08d58f005cc0507c" + integrity sha512-hOUk6AyBFmqVrv7k5WAw/LpszxVbj9gGN4JRkIX52fdFAj1UA61KXmZDvqVEm+pOyec3+fIeZB02LYa/pWOArw== + +"@nodelib/fs.scandir@2.1.5": + version "2.1.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" + integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== + dependencies: + "@nodelib/fs.stat" "2.0.5" + run-parallel "^1.1.9" + +"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" + integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== + +"@nodelib/fs.walk@^1.2.3", "@nodelib/fs.walk@^1.2.8": + version "1.2.8" + resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" + integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== + dependencies: + "@nodelib/fs.scandir" "2.1.5" + fastq "^1.6.0" + +"@nomicfoundation/ethereumjs-block@5.0.2": + version "5.0.2" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-block/-/ethereumjs-block-5.0.2.tgz#13a7968f5964f1697da941281b7f7943b0465d04" + integrity sha512-hSe6CuHI4SsSiWWjHDIzWhSiAVpzMUcDRpWYzN0T9l8/Rz7xNn3elwVOJ/tAyS0LqL6vitUD78Uk7lQDXZun7Q== + dependencies: + "@nomicfoundation/ethereumjs-common" "4.0.2" + "@nomicfoundation/ethereumjs-rlp" "5.0.2" + "@nomicfoundation/ethereumjs-trie" "6.0.2" + "@nomicfoundation/ethereumjs-tx" "5.0.2" + "@nomicfoundation/ethereumjs-util" "9.0.2" + ethereum-cryptography "0.1.3" + ethers "^5.7.1" + +"@nomicfoundation/ethereumjs-blockchain@7.0.2": + version "7.0.2" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-blockchain/-/ethereumjs-blockchain-7.0.2.tgz#45323b673b3d2fab6b5008535340d1b8fea7d446" + integrity sha512-8UUsSXJs+MFfIIAKdh3cG16iNmWzWC/91P40sazNvrqhhdR/RtGDlFk2iFTGbBAZPs2+klZVzhRX8m2wvuvz3w== + dependencies: + "@nomicfoundation/ethereumjs-block" "5.0.2" + "@nomicfoundation/ethereumjs-common" "4.0.2" + "@nomicfoundation/ethereumjs-ethash" "3.0.2" + "@nomicfoundation/ethereumjs-rlp" "5.0.2" + "@nomicfoundation/ethereumjs-trie" "6.0.2" + "@nomicfoundation/ethereumjs-tx" "5.0.2" + "@nomicfoundation/ethereumjs-util" "9.0.2" + abstract-level "^1.0.3" + debug "^4.3.3" + ethereum-cryptography "0.1.3" + level "^8.0.0" + lru-cache "^5.1.1" + memory-level "^1.0.0" + +"@nomicfoundation/ethereumjs-common@4.0.2": + version "4.0.2" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-common/-/ethereumjs-common-4.0.2.tgz#a15d1651ca36757588fdaf2a7d381a150662a3c3" + integrity sha512-I2WGP3HMGsOoycSdOTSqIaES0ughQTueOsddJ36aYVpI3SN8YSusgRFLwzDJwRFVIYDKx/iJz0sQ5kBHVgdDwg== + dependencies: + "@nomicfoundation/ethereumjs-util" "9.0.2" + crc-32 "^1.2.0" + +"@nomicfoundation/ethereumjs-ethash@3.0.2": + version "3.0.2" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-ethash/-/ethereumjs-ethash-3.0.2.tgz#da77147f806401ee996bfddfa6487500118addca" + integrity sha512-8PfoOQCcIcO9Pylq0Buijuq/O73tmMVURK0OqdjhwqcGHYC2PwhbajDh7GZ55ekB0Px197ajK3PQhpKoiI/UPg== + dependencies: + "@nomicfoundation/ethereumjs-block" "5.0.2" + "@nomicfoundation/ethereumjs-rlp" "5.0.2" + "@nomicfoundation/ethereumjs-util" "9.0.2" + abstract-level "^1.0.3" + bigint-crypto-utils "^3.0.23" + ethereum-cryptography "0.1.3" + +"@nomicfoundation/ethereumjs-evm@2.0.2": + version "2.0.2" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-evm/-/ethereumjs-evm-2.0.2.tgz#4c2f4b84c056047102a4fa41c127454e3f0cfcf6" + integrity sha512-rBLcUaUfANJxyOx9HIdMX6uXGin6lANCulIm/pjMgRqfiCRMZie3WKYxTSd8ZE/d+qT+zTedBF4+VHTdTSePmQ== + dependencies: + "@ethersproject/providers" "^5.7.1" + "@nomicfoundation/ethereumjs-common" "4.0.2" + "@nomicfoundation/ethereumjs-tx" "5.0.2" + "@nomicfoundation/ethereumjs-util" "9.0.2" + debug "^4.3.3" + ethereum-cryptography "0.1.3" + mcl-wasm "^0.7.1" + rustbn.js "~0.2.0" + +"@nomicfoundation/ethereumjs-rlp@5.0.2": + version "5.0.2" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-rlp/-/ethereumjs-rlp-5.0.2.tgz#4fee8dc58a53ac6ae87fb1fca7c15dc06c6b5dea" + integrity sha512-QwmemBc+MMsHJ1P1QvPl8R8p2aPvvVcKBbvHnQOKBpBztEo0omN0eaob6FeZS/e3y9NSe+mfu3nNFBHszqkjTA== + +"@nomicfoundation/ethereumjs-statemanager@2.0.2": + version "2.0.2" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-statemanager/-/ethereumjs-statemanager-2.0.2.tgz#3ba4253b29b1211cafe4f9265fee5a0d780976e0" + integrity sha512-dlKy5dIXLuDubx8Z74sipciZnJTRSV/uHG48RSijhgm1V7eXYFC567xgKtsKiVZB1ViTP9iFL4B6Je0xD6X2OA== + dependencies: + "@nomicfoundation/ethereumjs-common" "4.0.2" + "@nomicfoundation/ethereumjs-rlp" "5.0.2" + debug "^4.3.3" + ethereum-cryptography "0.1.3" + ethers "^5.7.1" + js-sdsl "^4.1.4" + +"@nomicfoundation/ethereumjs-trie@6.0.2": + version "6.0.2" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-trie/-/ethereumjs-trie-6.0.2.tgz#9a6dbd28482dca1bc162d12b3733acab8cd12835" + integrity sha512-yw8vg9hBeLYk4YNg5MrSJ5H55TLOv2FSWUTROtDtTMMmDGROsAu+0tBjiNGTnKRi400M6cEzoFfa89Fc5k8NTQ== + dependencies: + "@nomicfoundation/ethereumjs-rlp" "5.0.2" + "@nomicfoundation/ethereumjs-util" "9.0.2" + "@types/readable-stream" "^2.3.13" + ethereum-cryptography "0.1.3" + readable-stream "^3.6.0" + +"@nomicfoundation/ethereumjs-tx@5.0.2": + version "5.0.2" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-tx/-/ethereumjs-tx-5.0.2.tgz#117813b69c0fdc14dd0446698a64be6df71d7e56" + integrity sha512-T+l4/MmTp7VhJeNloMkM+lPU3YMUaXdcXgTGCf8+ZFvV9NYZTRLFekRwlG6/JMmVfIfbrW+dRRJ9A6H5Q/Z64g== + dependencies: + "@chainsafe/ssz" "^0.9.2" + "@ethersproject/providers" "^5.7.2" + "@nomicfoundation/ethereumjs-common" "4.0.2" + "@nomicfoundation/ethereumjs-rlp" "5.0.2" + "@nomicfoundation/ethereumjs-util" "9.0.2" + ethereum-cryptography "0.1.3" + +"@nomicfoundation/ethereumjs-util@9.0.2": + version "9.0.2" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-util/-/ethereumjs-util-9.0.2.tgz#16bdc1bb36f333b8a3559bbb4b17dac805ce904d" + integrity sha512-4Wu9D3LykbSBWZo8nJCnzVIYGvGCuyiYLIJa9XXNVt1q1jUzHdB+sJvx95VGCpPkCT+IbLecW6yfzy3E1bQrwQ== + dependencies: + "@chainsafe/ssz" "^0.10.0" + "@nomicfoundation/ethereumjs-rlp" "5.0.2" + ethereum-cryptography "0.1.3" + +"@nomicfoundation/ethereumjs-vm@7.0.2": + version "7.0.2" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-vm/-/ethereumjs-vm-7.0.2.tgz#3b0852cb3584df0e18c182d0672a3596c9ca95e6" + integrity sha512-Bj3KZT64j54Tcwr7Qm/0jkeZXJMfdcAtRBedou+Hx0dPOSIgqaIr0vvLwP65TpHbak2DmAq+KJbW2KNtIoFwvA== + dependencies: + "@nomicfoundation/ethereumjs-block" "5.0.2" + "@nomicfoundation/ethereumjs-blockchain" "7.0.2" + "@nomicfoundation/ethereumjs-common" "4.0.2" + "@nomicfoundation/ethereumjs-evm" "2.0.2" + "@nomicfoundation/ethereumjs-rlp" "5.0.2" + "@nomicfoundation/ethereumjs-statemanager" "2.0.2" + "@nomicfoundation/ethereumjs-trie" "6.0.2" + "@nomicfoundation/ethereumjs-tx" "5.0.2" + "@nomicfoundation/ethereumjs-util" "9.0.2" + debug "^4.3.3" + ethereum-cryptography "0.1.3" + mcl-wasm "^0.7.1" + rustbn.js "~0.2.0" + +"@nomicfoundation/solidity-analyzer-darwin-arm64@0.1.1": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-darwin-arm64/-/solidity-analyzer-darwin-arm64-0.1.1.tgz#4c858096b1c17fe58a474fe81b46815f93645c15" + integrity sha512-KcTodaQw8ivDZyF+D76FokN/HdpgGpfjc/gFCImdLUyqB6eSWVaZPazMbeAjmfhx3R0zm/NYVzxwAokFKgrc0w== + +"@nomicfoundation/solidity-analyzer-darwin-x64@0.1.1": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-darwin-x64/-/solidity-analyzer-darwin-x64-0.1.1.tgz#6e25ccdf6e2d22389c35553b64fe6f3fdaec432c" + integrity sha512-XhQG4BaJE6cIbjAVtzGOGbK3sn1BO9W29uhk9J8y8fZF1DYz0Doj8QDMfpMu+A6TjPDs61lbsmeYodIDnfveSA== + +"@nomicfoundation/solidity-analyzer-freebsd-x64@0.1.1": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-freebsd-x64/-/solidity-analyzer-freebsd-x64-0.1.1.tgz#0a224ea50317139caeebcdedd435c28a039d169c" + integrity sha512-GHF1VKRdHW3G8CndkwdaeLkVBi5A9u2jwtlS7SLhBc8b5U/GcoL39Q+1CSO3hYqePNP+eV5YI7Zgm0ea6kMHoA== + +"@nomicfoundation/solidity-analyzer-linux-arm64-gnu@0.1.1": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-linux-arm64-gnu/-/solidity-analyzer-linux-arm64-gnu-0.1.1.tgz#dfa085d9ffab9efb2e7b383aed3f557f7687ac2b" + integrity sha512-g4Cv2fO37ZsUENQ2vwPnZc2zRenHyAxHcyBjKcjaSmmkKrFr64yvzeNO8S3GBFCo90rfochLs99wFVGT/0owpg== + +"@nomicfoundation/solidity-analyzer-linux-arm64-musl@0.1.1": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-linux-arm64-musl/-/solidity-analyzer-linux-arm64-musl-0.1.1.tgz#c9e06b5d513dd3ab02a7ac069c160051675889a4" + integrity sha512-WJ3CE5Oek25OGE3WwzK7oaopY8xMw9Lhb0mlYuJl/maZVo+WtP36XoQTb7bW/i8aAdHW5Z+BqrHMux23pvxG3w== + +"@nomicfoundation/solidity-analyzer-linux-x64-gnu@0.1.1": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-linux-x64-gnu/-/solidity-analyzer-linux-x64-gnu-0.1.1.tgz#8d328d16839e52571f72f2998c81e46bf320f893" + integrity sha512-5WN7leSr5fkUBBjE4f3wKENUy9HQStu7HmWqbtknfXkkil+eNWiBV275IOlpXku7v3uLsXTOKpnnGHJYI2qsdA== + +"@nomicfoundation/solidity-analyzer-linux-x64-musl@0.1.1": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-linux-x64-musl/-/solidity-analyzer-linux-x64-musl-0.1.1.tgz#9b49d0634b5976bb5ed1604a1e1b736f390959bb" + integrity sha512-KdYMkJOq0SYPQMmErv/63CwGwMm5XHenEna9X9aB8mQmhDBrYrlAOSsIPgFCUSL0hjxE3xHP65/EPXR/InD2+w== + +"@nomicfoundation/solidity-analyzer-win32-arm64-msvc@0.1.1": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-win32-arm64-msvc/-/solidity-analyzer-win32-arm64-msvc-0.1.1.tgz#e2867af7264ebbcc3131ef837878955dd6a3676f" + integrity sha512-VFZASBfl4qiBYwW5xeY20exWhmv6ww9sWu/krWSesv3q5hA0o1JuzmPHR4LPN6SUZj5vcqci0O6JOL8BPw+APg== + +"@nomicfoundation/solidity-analyzer-win32-ia32-msvc@0.1.1": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-win32-ia32-msvc/-/solidity-analyzer-win32-ia32-msvc-0.1.1.tgz#0685f78608dd516c8cdfb4896ed451317e559585" + integrity sha512-JnFkYuyCSA70j6Si6cS1A9Gh1aHTEb8kOTBApp/c7NRTFGNMH8eaInKlyuuiIbvYFhlXW4LicqyYuWNNq9hkpQ== + +"@nomicfoundation/solidity-analyzer-win32-x64-msvc@0.1.1": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-win32-x64-msvc/-/solidity-analyzer-win32-x64-msvc-0.1.1.tgz#c9a44f7108646f083b82e851486e0f6aeb785836" + integrity sha512-HrVJr6+WjIXGnw3Q9u6KQcbZCtk0caVWhCdFADySvRyUxJ8PnzlaP+MhwNE8oyT8OZ6ejHBRrrgjSqDCFXGirw== + +"@nomicfoundation/solidity-analyzer@^0.1.0": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer/-/solidity-analyzer-0.1.1.tgz#f5f4d36d3f66752f59a57e7208cd856f3ddf6f2d" + integrity sha512-1LMtXj1puAxyFusBgUIy5pZk3073cNXYnXUpuNKFghHbIit/xZgbk0AokpUADbNm3gyD6bFWl3LRFh3dhVdREg== + optionalDependencies: + "@nomicfoundation/solidity-analyzer-darwin-arm64" "0.1.1" + "@nomicfoundation/solidity-analyzer-darwin-x64" "0.1.1" + "@nomicfoundation/solidity-analyzer-freebsd-x64" "0.1.1" + "@nomicfoundation/solidity-analyzer-linux-arm64-gnu" "0.1.1" + "@nomicfoundation/solidity-analyzer-linux-arm64-musl" "0.1.1" + "@nomicfoundation/solidity-analyzer-linux-x64-gnu" "0.1.1" + "@nomicfoundation/solidity-analyzer-linux-x64-musl" "0.1.1" + "@nomicfoundation/solidity-analyzer-win32-arm64-msvc" "0.1.1" + "@nomicfoundation/solidity-analyzer-win32-ia32-msvc" "0.1.1" + "@nomicfoundation/solidity-analyzer-win32-x64-msvc" "0.1.1" + +"@npmcli/fs@^1.0.0": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@npmcli/fs/-/fs-1.1.1.tgz#72f719fe935e687c56a4faecf3c03d06ba593257" + integrity sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ== + dependencies: + "@gar/promisify" "^1.0.1" + semver "^7.3.5" + +"@npmcli/fs@^2.1.0": + version "2.1.2" + resolved "https://registry.yarnpkg.com/@npmcli/fs/-/fs-2.1.2.tgz#a9e2541a4a2fec2e69c29b35e6060973da79b865" + integrity sha512-yOJKRvohFOaLqipNtwYB9WugyZKhC/DZC4VYPmpaCzDBrA8YpK3qHZ8/HGscMnE4GqbkLNuVcCnxkeQEdGt6LQ== + dependencies: + "@gar/promisify" "^1.1.3" + semver "^7.3.5" + +"@npmcli/fs@^3.1.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@npmcli/fs/-/fs-3.1.0.tgz#233d43a25a91d68c3a863ba0da6a3f00924a173e" + integrity sha512-7kZUAaLscfgbwBQRbvdMYaZOWyMEcPTH/tJjnyAWJ/dvvs9Ef+CERx/qJb9GExJpl1qipaDGn7KqHnFGGixd0w== + dependencies: + semver "^7.3.5" + +"@npmcli/git@^4.0.0": + version "4.1.0" + resolved "https://registry.yarnpkg.com/@npmcli/git/-/git-4.1.0.tgz#ab0ad3fd82bc4d8c1351b6c62f0fa56e8fe6afa6" + integrity sha512-9hwoB3gStVfa0N31ymBmrX+GuDGdVA/QWShZVqE0HK2Af+7QGGrCTbZia/SW0ImUTjTne7SP91qxDmtXvDHRPQ== + dependencies: + "@npmcli/promise-spawn" "^6.0.0" + lru-cache "^7.4.4" + npm-pick-manifest "^8.0.0" + proc-log "^3.0.0" + promise-inflight "^1.0.1" + promise-retry "^2.0.1" + semver "^7.3.5" + which "^3.0.0" + +"@npmcli/installed-package-contents@^2.0.1": + version "2.0.2" + resolved "https://registry.yarnpkg.com/@npmcli/installed-package-contents/-/installed-package-contents-2.0.2.tgz#bfd817eccd9e8df200919e73f57f9e3d9e4f9e33" + integrity sha512-xACzLPhnfD51GKvTOOuNX2/V4G4mz9/1I2MfDoye9kBM3RYe5g2YbscsaGoTlaWqkxeiapBWyseULVKpSVHtKQ== + dependencies: + npm-bundled "^3.0.0" + npm-normalize-package-bin "^3.0.0" + +"@npmcli/move-file@^1.0.1": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@npmcli/move-file/-/move-file-1.1.2.tgz#1a82c3e372f7cae9253eb66d72543d6b8685c674" + integrity sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg== + dependencies: + mkdirp "^1.0.4" + rimraf "^3.0.2" + +"@npmcli/move-file@^2.0.0": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@npmcli/move-file/-/move-file-2.0.1.tgz#26f6bdc379d87f75e55739bab89db525b06100e4" + integrity sha512-mJd2Z5TjYWq/ttPLLGqArdtnC74J6bOzg4rMDnN+p1xTacZ2yPRCk2y0oSWQtygLR9YVQXgOcONrwtnk3JupxQ== + dependencies: + mkdirp "^1.0.4" + rimraf "^3.0.2" + +"@npmcli/node-gyp@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@npmcli/node-gyp/-/node-gyp-3.0.0.tgz#101b2d0490ef1aa20ed460e4c0813f0db560545a" + integrity sha512-gp8pRXC2oOxu0DUE1/M3bYtb1b3/DbJ5aM113+XJBgfXdussRAsX0YOrOhdd8WvnAR6auDBvJomGAkLKA5ydxA== + +"@npmcli/promise-spawn@^6.0.0", "@npmcli/promise-spawn@^6.0.1": + version "6.0.2" + resolved "https://registry.yarnpkg.com/@npmcli/promise-spawn/-/promise-spawn-6.0.2.tgz#c8bc4fa2bd0f01cb979d8798ba038f314cfa70f2" + integrity sha512-gGq0NJkIGSwdbUt4yhdF8ZrmkGKVz9vAdVzpOfnom+V8PLSmSOVhZwbNvZZS1EYcJN5hzzKBxmmVVAInM6HQLg== + dependencies: + which "^3.0.0" + +"@npmcli/run-script@6.0.2", "@npmcli/run-script@^6.0.0": + version "6.0.2" + resolved "https://registry.yarnpkg.com/@npmcli/run-script/-/run-script-6.0.2.tgz#a25452d45ee7f7fb8c16dfaf9624423c0c0eb885" + integrity sha512-NCcr1uQo1k5U+SYlnIrbAh3cxy+OQT1VtqiAbxdymSlptbzBb62AjH2xXgjNCoP073hoa1CfCAcwoZ8k96C4nA== + dependencies: + "@npmcli/node-gyp" "^3.0.0" + "@npmcli/promise-spawn" "^6.0.0" + node-gyp "^9.0.0" + read-package-json-fast "^3.0.0" + which "^3.0.0" + +"@nrwl/devkit@16.10.0": + version "16.10.0" + resolved "https://registry.yarnpkg.com/@nrwl/devkit/-/devkit-16.10.0.tgz#ac8c5b4db00f12c4b817c937be2f7c4eb8f2593c" + integrity sha512-fRloARtsDQoQgQ7HKEy0RJiusg/HSygnmg4gX/0n/Z+SUS+4KoZzvHjXc6T5ZdEiSjvLypJ+HBM8dQzIcVACPQ== + dependencies: + "@nx/devkit" "16.10.0" + +"@nrwl/tao@16.10.0": + version "16.10.0" + resolved "https://registry.yarnpkg.com/@nrwl/tao/-/tao-16.10.0.tgz#94642a0380709b8e387e1e33705a5a9624933375" + integrity sha512-QNAanpINbr+Pod6e1xNgFbzK1x5wmZl+jMocgiEFXZ67KHvmbD6MAQQr0MMz+GPhIu7EE4QCTLTyCEMlAG+K5Q== + dependencies: + nx "16.10.0" + tslib "^2.3.0" + +"@nx/devkit@16.10.0", "@nx/devkit@>=16.5.1 < 17": + version "16.10.0" + resolved "https://registry.yarnpkg.com/@nx/devkit/-/devkit-16.10.0.tgz#7e466be2dee2dcb1ccaf286786ca2a0a639aa007" + integrity sha512-IvKQqRJFDDiaj33SPfGd3ckNHhHi6ceEoqCbAP4UuMXOPPVOX6H0KVk+9tknkPb48B7jWIw6/AgOeWkBxPRO5w== + dependencies: + "@nrwl/devkit" "16.10.0" + ejs "^3.1.7" + enquirer "~2.3.6" + ignore "^5.0.4" + semver "7.5.3" + tmp "~0.2.1" + tslib "^2.3.0" + +"@nx/nx-darwin-arm64@16.10.0": + version "16.10.0" + resolved "https://registry.yarnpkg.com/@nx/nx-darwin-arm64/-/nx-darwin-arm64-16.10.0.tgz#0c73010cac7a502549483b12bad347da9014e6f1" + integrity sha512-YF+MIpeuwFkyvM5OwgY/rTNRpgVAI/YiR0yTYCZR+X3AAvP775IVlusNgQ3oedTBRUzyRnI4Tknj1WniENFsvQ== + +"@nx/nx-darwin-x64@16.10.0": + version "16.10.0" + resolved "https://registry.yarnpkg.com/@nx/nx-darwin-x64/-/nx-darwin-x64-16.10.0.tgz#2ccf270418d552fd0a8e0d6089aee4944315adaa" + integrity sha512-ypi6YxwXgb0kg2ixKXE3pwf5myVNUgWf1CsV5OzVccCM8NzheMO51KDXTDmEpXdzUsfT0AkO1sk5GZeCjhVONg== + +"@nx/nx-freebsd-x64@16.10.0": + version "16.10.0" + resolved "https://registry.yarnpkg.com/@nx/nx-freebsd-x64/-/nx-freebsd-x64-16.10.0.tgz#c3ee6914256e69493fed9355b0d6661d0e86da44" + integrity sha512-UeEYFDmdbbDkTQamqvtU8ibgu5jQLgFF1ruNb/U4Ywvwutw2d4ruOMl2e0u9hiNja9NFFAnDbvzrDcMo7jYqYw== + +"@nx/nx-linux-arm-gnueabihf@16.10.0": + version "16.10.0" + resolved "https://registry.yarnpkg.com/@nx/nx-linux-arm-gnueabihf/-/nx-linux-arm-gnueabihf-16.10.0.tgz#a961eccbb38acb2da7fc125b29d1fead0b39152f" + integrity sha512-WV3XUC2DB6/+bz1sx+d1Ai9q2Cdr+kTZRN50SOkfmZUQyEBaF6DRYpx/a4ahhxH3ktpNfyY8Maa9OEYxGCBkQA== + +"@nx/nx-linux-arm64-gnu@16.10.0": + version "16.10.0" + resolved "https://registry.yarnpkg.com/@nx/nx-linux-arm64-gnu/-/nx-linux-arm64-gnu-16.10.0.tgz#795f20072549d03822b5c4639ef438e473dbb541" + integrity sha512-aWIkOUw995V3ItfpAi5FuxQ+1e9EWLS1cjWM1jmeuo+5WtaKToJn5itgQOkvSlPz+HSLgM3VfXMvOFALNk125g== + +"@nx/nx-linux-arm64-musl@16.10.0": + version "16.10.0" + resolved "https://registry.yarnpkg.com/@nx/nx-linux-arm64-musl/-/nx-linux-arm64-musl-16.10.0.tgz#f2428ee6dbe2b2c326e8973f76c97666def33607" + integrity sha512-uO6Gg+irqpVcCKMcEPIQcTFZ+tDI02AZkqkP7koQAjniLEappd8DnUBSQdcn53T086pHpdc264X/ZEpXFfrKWQ== + +"@nx/nx-linux-x64-gnu@16.10.0": + version "16.10.0" + resolved "https://registry.yarnpkg.com/@nx/nx-linux-x64-gnu/-/nx-linux-x64-gnu-16.10.0.tgz#d36c2bcf94d49eaa24e3880ddaf6f1f617de539b" + integrity sha512-134PW/u/arNFAQKpqMJniC7irbChMPz+W+qtyKPAUXE0XFKPa7c1GtlI/wK2dvP9qJDZ6bKf0KtA0U/m2HMUOA== + +"@nx/nx-linux-x64-musl@16.10.0": + version "16.10.0" + resolved "https://registry.yarnpkg.com/@nx/nx-linux-x64-musl/-/nx-linux-x64-musl-16.10.0.tgz#78bd2ab97a583b3d4ea3387b67fd7b136907493c" + integrity sha512-q8sINYLdIJxK/iUx9vRk5jWAWb/2O0PAbOJFwv4qkxBv4rLoN7y+otgCZ5v0xfx/zztFgk/oNY4lg5xYjIso2Q== + +"@nx/nx-win32-arm64-msvc@16.10.0": + version "16.10.0" + resolved "https://registry.yarnpkg.com/@nx/nx-win32-arm64-msvc/-/nx-win32-arm64-msvc-16.10.0.tgz#ef20ec8d0c83d66e73e20df12d2c788b8f866396" + integrity sha512-moJkL9kcqxUdJSRpG7dET3UeLIciwrfP08mzBQ12ewo8K8FzxU8ZUsTIVVdNrwt01CXOdXoweGfdQLjJ4qTURA== + +"@nx/nx-win32-x64-msvc@16.10.0": + version "16.10.0" + resolved "https://registry.yarnpkg.com/@nx/nx-win32-x64-msvc/-/nx-win32-x64-msvc-16.10.0.tgz#7410a51d0f8be631eec9552f01b2e5946285927c" + integrity sha512-5iV2NKZnzxJwZZ4DM5JVbRG/nkhAbzEskKaLBB82PmYGKzaDHuMHP1lcPoD/rtYMlowZgNA/RQndfKvPBPwmXA== + +"@octokit/auth-token@^3.0.0": + version "3.0.4" + resolved "https://registry.yarnpkg.com/@octokit/auth-token/-/auth-token-3.0.4.tgz#70e941ba742bdd2b49bdb7393e821dea8520a3db" + integrity sha512-TWFX7cZF2LXoCvdmJWY7XVPi74aSY0+FfBZNSXEXFkMpjcqsQwDSYVv5FhRFaI0V1ECnwbz4j59T/G+rXNWaIQ== + +"@octokit/core@^4.2.1": + version "4.2.4" + resolved "https://registry.yarnpkg.com/@octokit/core/-/core-4.2.4.tgz#d8769ec2b43ff37cc3ea89ec4681a20ba58ef907" + integrity sha512-rYKilwgzQ7/imScn3M9/pFfUf4I1AZEH3KhyJmtPdE2zfaXAn2mFfUy4FbKewzc2We5y/LlKLj36fWJLKC2SIQ== + dependencies: + "@octokit/auth-token" "^3.0.0" + "@octokit/graphql" "^5.0.0" + "@octokit/request" "^6.0.0" + "@octokit/request-error" "^3.0.0" + "@octokit/types" "^9.0.0" + before-after-hook "^2.2.0" + universal-user-agent "^6.0.0" + +"@octokit/endpoint@^7.0.0": + version "7.0.6" + resolved "https://registry.yarnpkg.com/@octokit/endpoint/-/endpoint-7.0.6.tgz#791f65d3937555141fb6c08f91d618a7d645f1e2" + integrity sha512-5L4fseVRUsDFGR00tMWD/Trdeeihn999rTMGRMC1G/Ldi1uWlWJzI98H4Iak5DB/RVvQuyMYKqSK/R6mbSOQyg== + dependencies: + "@octokit/types" "^9.0.0" + is-plain-object "^5.0.0" + universal-user-agent "^6.0.0" + +"@octokit/graphql@^5.0.0": + version "5.0.6" + resolved "https://registry.yarnpkg.com/@octokit/graphql/-/graphql-5.0.6.tgz#9eac411ac4353ccc5d3fca7d76736e6888c5d248" + integrity sha512-Fxyxdy/JH0MnIB5h+UQ3yCoh1FG4kWXfFKkpWqjZHw/p+Kc8Y44Hu/kCgNBT6nU1shNumEchmW/sUO1JuQnPcw== + dependencies: + "@octokit/request" "^6.0.0" + "@octokit/types" "^9.0.0" + universal-user-agent "^6.0.0" + +"@octokit/openapi-types@^18.0.0": + version "18.1.1" + resolved "https://registry.yarnpkg.com/@octokit/openapi-types/-/openapi-types-18.1.1.tgz#09bdfdabfd8e16d16324326da5148010d765f009" + integrity sha512-VRaeH8nCDtF5aXWnjPuEMIYf1itK/s3JYyJcWFJT8X9pSNnBtriDf7wlEWsGuhPLl4QIH4xM8fqTXDwJ3Mu6sw== + +"@octokit/plugin-enterprise-rest@6.0.1": + version "6.0.1" + resolved "https://registry.yarnpkg.com/@octokit/plugin-enterprise-rest/-/plugin-enterprise-rest-6.0.1.tgz#e07896739618dab8da7d4077c658003775f95437" + integrity sha512-93uGjlhUD+iNg1iWhUENAtJata6w5nE+V4urXOAlIXdco6xNZtUSfYY8dzp3Udy74aqO/B5UZL80x/YMa5PKRw== + +"@octokit/plugin-paginate-rest@^6.1.2": + version "6.1.2" + resolved "https://registry.yarnpkg.com/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-6.1.2.tgz#f86456a7a1fe9e58fec6385a85cf1b34072341f8" + integrity sha512-qhrmtQeHU/IivxucOV1bbI/xZyC/iOBhclokv7Sut5vnejAIAEXVcGQeRpQlU39E0WwK9lNvJHphHri/DB6lbQ== + dependencies: + "@octokit/tsconfig" "^1.0.2" + "@octokit/types" "^9.2.3" + +"@octokit/plugin-request-log@^1.0.4": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@octokit/plugin-request-log/-/plugin-request-log-1.0.4.tgz#5e50ed7083a613816b1e4a28aeec5fb7f1462e85" + integrity sha512-mLUsMkgP7K/cnFEw07kWqXGF5LKrOkD+lhCrKvPHXWDywAwuDUeDwWBpc69XK3pNX0uKiVt8g5z96PJ6z9xCFA== + +"@octokit/plugin-rest-endpoint-methods@^7.1.2": + version "7.2.3" + resolved "https://registry.yarnpkg.com/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-7.2.3.tgz#37a84b171a6cb6658816c82c4082ac3512021797" + integrity sha512-I5Gml6kTAkzVlN7KCtjOM+Ruwe/rQppp0QU372K1GP7kNOYEKe8Xn5BW4sE62JAHdwpq95OQK/qGNyKQMUzVgA== + dependencies: + "@octokit/types" "^10.0.0" + +"@octokit/request-error@^3.0.0": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@octokit/request-error/-/request-error-3.0.3.tgz#ef3dd08b8e964e53e55d471acfe00baa892b9c69" + integrity sha512-crqw3V5Iy2uOU5Np+8M/YexTlT8zxCfI+qu+LxUB7SZpje4Qmx3mub5DfEKSO8Ylyk0aogi6TYdf6kxzh2BguQ== + dependencies: + "@octokit/types" "^9.0.0" + deprecation "^2.0.0" + once "^1.4.0" + +"@octokit/request@^6.0.0": + version "6.2.8" + resolved "https://registry.yarnpkg.com/@octokit/request/-/request-6.2.8.tgz#aaf480b32ab2b210e9dadd8271d187c93171d8eb" + integrity sha512-ow4+pkVQ+6XVVsekSYBzJC0VTVvh/FCTUUgTsboGq+DTeWdyIFV8WSCdo0RIxk6wSkBTHqIK1mYuY7nOBXOchw== + dependencies: + "@octokit/endpoint" "^7.0.0" + "@octokit/request-error" "^3.0.0" + "@octokit/types" "^9.0.0" + is-plain-object "^5.0.0" + node-fetch "^2.6.7" + universal-user-agent "^6.0.0" + +"@octokit/rest@19.0.11": + version "19.0.11" + resolved "https://registry.yarnpkg.com/@octokit/rest/-/rest-19.0.11.tgz#2ae01634fed4bd1fca5b642767205ed3fd36177c" + integrity sha512-m2a9VhaP5/tUw8FwfnW2ICXlXpLPIqxtg3XcAiGMLj/Xhw3RSBfZ8le/466ktO1Gcjr8oXudGnHhxV1TXJgFxw== + dependencies: + "@octokit/core" "^4.2.1" + "@octokit/plugin-paginate-rest" "^6.1.2" + "@octokit/plugin-request-log" "^1.0.4" + "@octokit/plugin-rest-endpoint-methods" "^7.1.2" + +"@octokit/tsconfig@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@octokit/tsconfig/-/tsconfig-1.0.2.tgz#59b024d6f3c0ed82f00d08ead5b3750469125af7" + integrity sha512-I0vDR0rdtP8p2lGMzvsJzbhdOWy405HcGovrspJ8RRibHnyRgggUSNO5AIox5LmqiwmatHKYsvj6VGFHkqS7lA== + +"@octokit/types@^10.0.0": + version "10.0.0" + resolved "https://registry.yarnpkg.com/@octokit/types/-/types-10.0.0.tgz#7ee19c464ea4ada306c43f1a45d444000f419a4a" + integrity sha512-Vm8IddVmhCgU1fxC1eyinpwqzXPEYu0NrYzD3YZjlGjyftdLBTeqNblRC0jmJmgxbJIsQlyogVeGnrNaaMVzIg== + dependencies: + "@octokit/openapi-types" "^18.0.0" + +"@octokit/types@^9.0.0", "@octokit/types@^9.2.3": + version "9.3.2" + resolved "https://registry.yarnpkg.com/@octokit/types/-/types-9.3.2.tgz#3f5f89903b69f6a2d196d78ec35f888c0013cac5" + integrity sha512-D4iHGTdAnEEVsB8fl95m1hiz7D5YiRdQ9b/OEb3BYRVwbLsGHcRVPz+u+BgRLNk0Q0/4iZCBqDN96j2XNxfXrA== + dependencies: + "@octokit/openapi-types" "^18.0.0" + +"@parcel/watcher@2.0.4": + version "2.0.4" + resolved "https://registry.yarnpkg.com/@parcel/watcher/-/watcher-2.0.4.tgz#f300fef4cc38008ff4b8c29d92588eced3ce014b" + integrity sha512-cTDi+FUDBIUOBKEtj+nhiJ71AZVlkAsQFuGQTun5tV9mwQBQgZvhCzG+URPQc8myeN32yRVZEfVAPCs1RW+Jvg== + dependencies: + node-addon-api "^3.2.1" + node-gyp-build "^4.3.0" + +"@particle-network/analytics@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@particle-network/analytics/-/analytics-1.0.1.tgz#b3657cf7aaea57f90a7ac2c03f72b8786c298012" + integrity sha512-ApcSMo1BXQlywO+lvOpG3Y2/SVGNCpJzXO/4e3zHzE/9j+uMehsilDzPwWQwLhrCXZYwVm7mmE71Gs36yobiNw== + dependencies: + hash.js "^1.1.7" + uuidv4 "^6.2.13" + +"@particle-network/auth@^1.2.1": + version "1.3.1" + resolved "https://registry.yarnpkg.com/@particle-network/auth/-/auth-1.3.1.tgz#f9ee51749e3b10e700e0d8c51a8c0769ab0b9851" + integrity sha512-hu6ie5RjjN4X+6y/vfjyCsSX3pQuS8k8ZoMb61QWwhWsnZXKzpBUVeAEk55aGfxxXY+KfBkSmZosyaZHGoHnfw== + dependencies: + "@particle-network/analytics" "^1.0.1" + "@particle-network/chains" "*" + "@particle-network/crypto" "^1.0.1" + buffer "^6.0.3" + draggabilly "^3.0.0" + +"@particle-network/biconomy@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@particle-network/biconomy/-/biconomy-1.0.0.tgz#91f79c6341db0fc9b23d3ed9c61fbb08df727c31" + integrity sha512-MvYdTGT48WJB72SqkmZbx3NI8HdjWb8EZNKIkbddcusws/Uqy4dHV2+tP7UWup+vGltCXK/55KAdvgcwFTsZrQ== + dependencies: + axios "^1.3.6" + uuid "^8.3.2" + +"@particle-network/chains@*": + version "1.3.16" + resolved "https://registry.yarnpkg.com/@particle-network/chains/-/chains-1.3.16.tgz#5b56104b0d7a6c87d17eb7f2d597ee358a430cd9" + integrity sha512-vr30c56QmMMxXP59hL4MysdmKNHCD2JmMEdhfly5C+HB+N4p/a7ioblioatRIukgZPP9/Qnc7TPJISGlQaGWpA== + +"@particle-network/crypto@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@particle-network/crypto/-/crypto-1.0.1.tgz#26afef622a3eb906dca5c810fef8001ffee29029" + integrity sha512-GgvHmHcFiNkCLZdcJOgctSbgvs251yp+EAdUydOE3gSoIxN6KEr/Snu9DebENhd/nFb7FDk5ap0Hg49P7pj1fg== + dependencies: + crypto-js "^4.1.1" + uuidv4 "^6.2.13" + +"@particle-network/provider@^1.2.0": + version "1.3.2" + resolved "https://registry.yarnpkg.com/@particle-network/provider/-/provider-1.3.2.tgz#68ae98cca471c7612206cb43c915719cd321fb25" + integrity sha512-3XAUMCISTMYE57LZik7PrVanLIUyyU1ufb5eHtsoQw5ORfH0IeX3E5o6x5mxtfOXKfxVQ0tsIoLRMw0jMmSDpA== + dependencies: + "@particle-network/chains" "*" + axios "^1.3.6" + uuid "^8.3.2" + +"@pkgjs/parseargs@^0.11.0": + version "0.11.0" + resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33" + integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg== + +"@pkgr/core@^0.1.0": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@pkgr/core/-/core-0.1.1.tgz#1ec17e2edbec25c8306d424ecfbf13c7de1aaa31" + integrity sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA== + +"@scure/base@~1.1.0", "@scure/base@~1.1.2", "@scure/base@~1.1.4": + version "1.1.5" + resolved "https://registry.yarnpkg.com/@scure/base/-/base-1.1.5.tgz#1d85d17269fe97694b9c592552dd9e5e33552157" + integrity sha512-Brj9FiG2W1MRQSTB212YVPRrcbjkv48FoZi/u4l/zds/ieRrqsh7aUf6CLwkAq61oKXr/ZlTzlY66gLIj3TFTQ== + +"@scure/bip32@1.1.5": + version "1.1.5" + resolved "https://registry.yarnpkg.com/@scure/bip32/-/bip32-1.1.5.tgz#d2ccae16dcc2e75bc1d75f5ef3c66a338d1ba300" + integrity sha512-XyNh1rB0SkEqd3tXcXMi+Xe1fvg+kUIcoRIEujP1Jgv7DqW2r9lg3Ah0NkFaCs9sTkQAQA8kw7xiRXzENi9Rtw== + dependencies: + "@noble/hashes" "~1.2.0" + "@noble/secp256k1" "~1.7.0" + "@scure/base" "~1.1.0" + +"@scure/bip32@1.3.2": + version "1.3.2" + resolved "https://registry.yarnpkg.com/@scure/bip32/-/bip32-1.3.2.tgz#90e78c027d5e30f0b22c1f8d50ff12f3fb7559f8" + integrity sha512-N1ZhksgwD3OBlwTv3R6KFEcPojl/W4ElJOeCZdi+vuI5QmTFwLq3OFf2zd2ROpKvxFdgZ6hUpb0dx9bVNEwYCA== + dependencies: + "@noble/curves" "~1.2.0" + "@noble/hashes" "~1.3.2" + "@scure/base" "~1.1.2" + +"@scure/bip32@1.3.3": + version "1.3.3" + resolved "https://registry.yarnpkg.com/@scure/bip32/-/bip32-1.3.3.tgz#a9624991dc8767087c57999a5d79488f48eae6c8" + integrity sha512-LJaN3HwRbfQK0X1xFSi0Q9amqOgzQnnDngIt+ZlsBC3Bm7/nE7K0kwshZHyaru79yIVRv/e1mQAjZyuZG6jOFQ== + dependencies: + "@noble/curves" "~1.3.0" + "@noble/hashes" "~1.3.2" + "@scure/base" "~1.1.4" + +"@scure/bip39@1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@scure/bip39/-/bip39-1.1.1.tgz#b54557b2e86214319405db819c4b6a370cf340c5" + integrity sha512-t+wDck2rVkh65Hmv280fYdVdY25J9YeEUIgn2LG1WM6gxFkGzcksoDiUkWVpVp3Oex9xGC68JU2dSbUfwZ2jPg== + dependencies: + "@noble/hashes" "~1.2.0" + "@scure/base" "~1.1.0" + +"@scure/bip39@1.2.1": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@scure/bip39/-/bip39-1.2.1.tgz#5cee8978656b272a917b7871c981e0541ad6ac2a" + integrity sha512-Z3/Fsz1yr904dduJD0NpiyRHhRYHdcnyh73FZWiV+/qhWi83wNJ3NWolYqCEN+ZWsUz2TWwajJggcRE9r1zUYg== + dependencies: + "@noble/hashes" "~1.3.0" + "@scure/base" "~1.1.0" + +"@scure/bip39@1.2.2": + version "1.2.2" + resolved "https://registry.yarnpkg.com/@scure/bip39/-/bip39-1.2.2.tgz#f3426813f4ced11a47489cbcf7294aa963966527" + integrity sha512-HYf9TUXG80beW+hGAt3TRM8wU6pQoYur9iNypTROm42dorCGmLnFe3eWjz3gOq6G62H2WRh0FCzAR1PI+29zIA== + dependencies: + "@noble/hashes" "~1.3.2" + "@scure/base" "~1.1.4" + +"@sentry/core@5.30.0": + version "5.30.0" + resolved "https://registry.yarnpkg.com/@sentry/core/-/core-5.30.0.tgz#6b203664f69e75106ee8b5a2fe1d717379b331f3" + integrity sha512-TmfrII8w1PQZSZgPpUESqjB+jC6MvZJZdLtE/0hZ+SrnKhW3x5WlYLvTXZpcWePYBku7rl2wn1RZu6uT0qCTeg== + dependencies: + "@sentry/hub" "5.30.0" + "@sentry/minimal" "5.30.0" + "@sentry/types" "5.30.0" + "@sentry/utils" "5.30.0" + tslib "^1.9.3" + +"@sentry/hub@5.30.0": + version "5.30.0" + resolved "https://registry.yarnpkg.com/@sentry/hub/-/hub-5.30.0.tgz#2453be9b9cb903404366e198bd30c7ca74cdc100" + integrity sha512-2tYrGnzb1gKz2EkMDQcfLrDTvmGcQPuWxLnJKXJvYTQDGLlEvi2tWz1VIHjunmOvJrB5aIQLhm+dcMRwFZDCqQ== + dependencies: + "@sentry/types" "5.30.0" + "@sentry/utils" "5.30.0" + tslib "^1.9.3" + +"@sentry/minimal@5.30.0": + version "5.30.0" + resolved "https://registry.yarnpkg.com/@sentry/minimal/-/minimal-5.30.0.tgz#ce3d3a6a273428e0084adcb800bc12e72d34637b" + integrity sha512-BwWb/owZKtkDX+Sc4zCSTNcvZUq7YcH3uAVlmh/gtR9rmUvbzAA3ewLuB3myi4wWRAMEtny6+J/FN/x+2wn9Xw== + dependencies: + "@sentry/hub" "5.30.0" + "@sentry/types" "5.30.0" + tslib "^1.9.3" + +"@sentry/node@^5.18.1": + version "5.30.0" + resolved "https://registry.yarnpkg.com/@sentry/node/-/node-5.30.0.tgz#4ca479e799b1021285d7fe12ac0858951c11cd48" + integrity sha512-Br5oyVBF0fZo6ZS9bxbJZG4ApAjRqAnqFFurMVJJdunNb80brh7a5Qva2kjhm+U6r9NJAB5OmDyPkA1Qnt+QVg== + dependencies: + "@sentry/core" "5.30.0" + "@sentry/hub" "5.30.0" + "@sentry/tracing" "5.30.0" + "@sentry/types" "5.30.0" + "@sentry/utils" "5.30.0" + cookie "^0.4.1" + https-proxy-agent "^5.0.0" + lru_map "^0.3.3" + tslib "^1.9.3" + +"@sentry/tracing@5.30.0": + version "5.30.0" + resolved "https://registry.yarnpkg.com/@sentry/tracing/-/tracing-5.30.0.tgz#501d21f00c3f3be7f7635d8710da70d9419d4e1f" + integrity sha512-dUFowCr0AIMwiLD7Fs314Mdzcug+gBVo/+NCMyDw8tFxJkwWAKl7Qa2OZxLQ0ZHjakcj1hNKfCQJ9rhyfOl4Aw== + dependencies: + "@sentry/hub" "5.30.0" + "@sentry/minimal" "5.30.0" + "@sentry/types" "5.30.0" + "@sentry/utils" "5.30.0" + tslib "^1.9.3" + +"@sentry/types@5.30.0": + version "5.30.0" + resolved "https://registry.yarnpkg.com/@sentry/types/-/types-5.30.0.tgz#19709bbe12a1a0115bc790b8942917da5636f402" + integrity sha512-R8xOqlSTZ+htqrfteCWU5Nk0CDN5ApUTvrlvBuiH1DyP6czDZ4ktbZB0hAgBlVcK0U+qpD3ag3Tqqpa5Q67rPw== + +"@sentry/utils@5.30.0": + version "5.30.0" + resolved "https://registry.yarnpkg.com/@sentry/utils/-/utils-5.30.0.tgz#9a5bd7ccff85ccfe7856d493bffa64cabc41e980" + integrity sha512-zaYmoH0NWWtvnJjC9/CBseXMtKHm/tm40sz3YfJRxeQjyzRqNQPgivpd9R/oDJCYj999mzdW382p/qi2ypjLww== + dependencies: + "@sentry/types" "5.30.0" + tslib "^1.9.3" + +"@sigstore/bundle@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@sigstore/bundle/-/bundle-1.1.0.tgz#17f8d813b09348b16eeed66a8cf1c3d6bd3d04f1" + integrity sha512-PFutXEy0SmQxYI4texPw3dd2KewuNqv7OuK1ZFtY2fM754yhvG2KdgwIhRnoEE2uHdtdGNQ8s0lb94dW9sELog== + dependencies: + "@sigstore/protobuf-specs" "^0.2.0" + +"@sigstore/protobuf-specs@^0.2.0": + version "0.2.1" + resolved "https://registry.yarnpkg.com/@sigstore/protobuf-specs/-/protobuf-specs-0.2.1.tgz#be9ef4f3c38052c43bd399d3f792c97ff9e2277b" + integrity sha512-XTWVxnWJu+c1oCshMLwnKvz8ZQJJDVOlciMfgpJBQbThVjKTCG8dwyhgLngBD2KN0ap9F/gOV8rFDEx8uh7R2A== + +"@sigstore/sign@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@sigstore/sign/-/sign-1.0.0.tgz#6b08ebc2f6c92aa5acb07a49784cb6738796f7b4" + integrity sha512-INxFVNQteLtcfGmcoldzV6Je0sbbfh9I16DM4yJPw3j5+TFP8X6uIiA18mvpEa9yyeycAKgPmOA3X9hVdVTPUA== + dependencies: + "@sigstore/bundle" "^1.1.0" + "@sigstore/protobuf-specs" "^0.2.0" + make-fetch-happen "^11.0.1" + +"@sigstore/tuf@^1.0.3": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@sigstore/tuf/-/tuf-1.0.3.tgz#2a65986772ede996485728f027b0514c0b70b160" + integrity sha512-2bRovzs0nJZFlCN3rXirE4gwxCn97JNjMmwpecqlbgV9WcxX7WRuIrgzx/X7Ib7MYRbyUTpBYE0s2x6AmZXnlg== + dependencies: + "@sigstore/protobuf-specs" "^0.2.0" + tuf-js "^1.1.7" + +"@sinclair/typebox@^0.27.8": + version "0.27.8" + resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.27.8.tgz#6667fac16c436b5434a387a34dedb013198f6e6e" + integrity sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA== + +"@sinonjs/commons@^3.0.0": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-3.0.1.tgz#1029357e44ca901a615585f6d27738dbc89084cd" + integrity sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ== + dependencies: + type-detect "4.0.8" + +"@sinonjs/fake-timers@^10.0.2": + version "10.3.0" + resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz#55fdff1ecab9f354019129daf4df0dd4d923ea66" + integrity sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA== + dependencies: + "@sinonjs/commons" "^3.0.0" + +"@tootallnate/once@1": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-1.1.2.tgz#ccb91445360179a04e7fe6aff78c00ffc1eeaf82" + integrity sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw== + +"@tootallnate/once@2": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-2.0.0.tgz#f544a148d3ab35801c1f633a7441fd87c2e484bf" + integrity sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A== + +"@transak/transak-sdk@^1.2.3": + version "1.4.1" + resolved "https://registry.yarnpkg.com/@transak/transak-sdk/-/transak-sdk-1.4.1.tgz#90dee041b772c71c35cfb22df9ef51970b780db4" + integrity sha512-/BKzb9orz1xDxa41oOPW+4KpjSHNEXgtaFazX/aIjQbr7LLbRqfXC/IHzpPmjR9OmFm8pFhV2Y86Rg0aZt5ZUA== + dependencies: + events "^3.3.0" + query-string "^8.1.0" + +"@trufflesuite/bigint-buffer@1.1.10": + version "1.1.10" + resolved "https://registry.yarnpkg.com/@trufflesuite/bigint-buffer/-/bigint-buffer-1.1.10.tgz#a1d9ca22d3cad1a138b78baaf15543637a3e1692" + integrity sha512-pYIQC5EcMmID74t26GCC67946mgTJFiLXOT/BYozgrd4UEY2JHEGLhWi9cMiQCt5BSqFEvKkCHNnoj82SRjiEw== + dependencies: + node-gyp-build "4.4.0" + +"@trufflesuite/uws-js-unofficial@20.30.0-unofficial.0": + version "20.30.0-unofficial.0" + resolved "https://registry.yarnpkg.com/@trufflesuite/uws-js-unofficial/-/uws-js-unofficial-20.30.0-unofficial.0.tgz#2fbc2f8ef7e82fbeea6abaf7e8a9d42a02b479d3" + integrity sha512-r5X0aOQcuT6pLwTRLD+mPnAM/nlKtvIK4Z+My++A8tTOR0qTjNRx8UB8jzRj3D+p9PMAp5LnpCUUGmz7/TppwA== + dependencies: + ws "8.13.0" + optionalDependencies: + bufferutil "4.0.7" + utf-8-validate "6.0.3" + +"@tsconfig/node10@^1.0.7": + version "1.0.9" + resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.9.tgz#df4907fc07a886922637b15e02d4cebc4c0021b2" + integrity sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA== + +"@tsconfig/node12@^1.0.7": + version "1.0.11" + resolved "https://registry.yarnpkg.com/@tsconfig/node12/-/node12-1.0.11.tgz#ee3def1f27d9ed66dac6e46a295cffb0152e058d" + integrity sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag== + +"@tsconfig/node14@^1.0.0": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@tsconfig/node14/-/node14-1.0.3.tgz#e4386316284f00b98435bf40f72f75a09dabf6c1" + integrity sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow== + +"@tsconfig/node16@^1.0.2": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.4.tgz#0b92dcc0cc1c81f6f306a381f28e31b1a56536e9" + integrity sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA== + +"@tufjs/canonical-json@1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@tufjs/canonical-json/-/canonical-json-1.0.0.tgz#eade9fd1f537993bc1f0949f3aea276ecc4fab31" + integrity sha512-QTnf++uxunWvG2z3UFNzAoQPHxnSXOwtaI3iJ+AohhV+5vONuArPjJE7aPXPVXfXJsqrVbZBu9b81AJoSd09IQ== + +"@tufjs/models@1.0.4": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@tufjs/models/-/models-1.0.4.tgz#5a689630f6b9dbda338d4b208019336562f176ef" + integrity sha512-qaGV9ltJP0EO25YfFUPhxRVK0evXFIAGicsVXuRim4Ed9cjPxYhNnNJ49SFmbeLgtxpslIkX317IgpfcHPVj/A== + dependencies: + "@tufjs/canonical-json" "1.0.0" + minimatch "^9.0.0" + +"@types/babel__core@^7.1.14": + version "7.20.5" + resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.20.5.tgz#3df15f27ba85319caa07ba08d0721889bb39c017" + integrity sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA== + dependencies: + "@babel/parser" "^7.20.7" + "@babel/types" "^7.20.7" + "@types/babel__generator" "*" + "@types/babel__template" "*" + "@types/babel__traverse" "*" + +"@types/babel__generator@*": + version "7.6.8" + resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.8.tgz#f836c61f48b1346e7d2b0d93c6dacc5b9535d3ab" + integrity sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw== + dependencies: + "@babel/types" "^7.0.0" + +"@types/babel__template@*": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.4.4.tgz#5672513701c1b2199bc6dad636a9d7491586766f" + integrity sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A== + dependencies: + "@babel/parser" "^7.1.0" + "@babel/types" "^7.0.0" + +"@types/babel__traverse@*", "@types/babel__traverse@^7.0.6": + version "7.20.5" + resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.20.5.tgz#7b7502be0aa80cc4ef22978846b983edaafcd4dd" + integrity sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ== + dependencies: + "@babel/types" "^7.20.7" + +"@types/bn.js@^4.11.3": + version "4.11.6" + resolved "https://registry.yarnpkg.com/@types/bn.js/-/bn.js-4.11.6.tgz#c306c70d9358aaea33cd4eda092a742b9505967c" + integrity sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg== + dependencies: + "@types/node" "*" + +"@types/bn.js@^5.1.0": + version "5.1.5" + resolved "https://registry.yarnpkg.com/@types/bn.js/-/bn.js-5.1.5.tgz#2e0dacdcce2c0f16b905d20ff87aedbc6f7b4bf0" + integrity sha512-V46N0zwKRF5Q00AZ6hWtN0T8gGmDUaUzLWQvHFo5yThtVwK/VCenFY3wXVbOvNfajEpsTfQM4IN9k/d6gUVX3A== + dependencies: + "@types/node" "*" + +"@types/debug@^4.1.9": + version "4.1.12" + resolved "https://registry.yarnpkg.com/@types/debug/-/debug-4.1.12.tgz#a155f21690871953410df4b6b6f53187f0500917" + integrity sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ== + dependencies: + "@types/ms" "*" + +"@types/graceful-fs@^4.1.3": + version "4.1.9" + resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.9.tgz#2a06bc0f68a20ab37b3e36aa238be6abdf49e8b4" + integrity sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ== + dependencies: + "@types/node" "*" + +"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0", "@types/istanbul-lib-coverage@^2.0.1": + version "2.0.6" + resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz#7739c232a1fee9b4d3ce8985f314c0c6d33549d7" + integrity sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w== + +"@types/istanbul-lib-report@*": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz#53047614ae72e19fc0401d872de3ae2b4ce350bf" + integrity sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA== + dependencies: + "@types/istanbul-lib-coverage" "*" + +"@types/istanbul-reports@^3.0.0": + version "3.0.4" + resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz#0f03e3d2f670fbdac586e34b433783070cc16f54" + integrity sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ== + dependencies: + "@types/istanbul-lib-report" "*" + +"@types/jest@^29.5.4": + version "29.5.12" + resolved "https://registry.yarnpkg.com/@types/jest/-/jest-29.5.12.tgz#7f7dc6eb4cf246d2474ed78744b05d06ce025544" + integrity sha512-eDC8bTvT/QhYdxJAulQikueigY5AsdBRH2yDKW3yveW7svY3+DzN84/2NUgkw10RTiJbWqZrTtoGVdYlvFJdLw== + dependencies: + expect "^29.0.0" + pretty-format "^29.0.0" + +"@types/json-schema@^7.0.12": + version "7.0.15" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841" + integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== + +"@types/json5@^0.0.29": + version "0.0.29" + resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" + integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== + +"@types/lru-cache@5.1.1", "@types/lru-cache@^5.1.0": + version "5.1.1" + resolved "https://registry.yarnpkg.com/@types/lru-cache/-/lru-cache-5.1.1.tgz#c48c2e27b65d2a153b19bfc1a317e30872e01eef" + integrity sha512-ssE3Vlrys7sdIzs5LOxCzTVMsU7i9oa/IaW92wF32JFb3CVczqOkru2xspuKczHEbG3nvmPY7IFqVmGGHdNbYw== + +"@types/minimatch@^3.0.3": + version "3.0.5" + resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.5.tgz#1001cc5e6a3704b83c236027e77f2f58ea010f40" + integrity sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ== + +"@types/minimist@^1.2.0": + version "1.2.5" + resolved "https://registry.yarnpkg.com/@types/minimist/-/minimist-1.2.5.tgz#ec10755e871497bcd83efe927e43ec46e8c0747e" + integrity sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag== + +"@types/ms@*": + version "0.7.34" + resolved "https://registry.yarnpkg.com/@types/ms/-/ms-0.7.34.tgz#10964ba0dee6ac4cd462e2795b6bebd407303433" + integrity sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g== + +"@types/node@*", "@types/node@^20.11.10": + version "20.11.17" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.11.17.tgz#cdd642d0e62ef3a861f88ddbc2b61e32578a9292" + integrity sha512-QmgQZGWu1Yw9TDyAP9ZzpFJKynYNeOvwMJmaxABfieQoVoiVOS6MN1WSpqpRcbeA5+RW82kraAVxCCJg+780Qw== + dependencies: + undici-types "~5.26.4" + +"@types/normalize-package-data@^2.4.0": + version "2.4.4" + resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz#56e2cc26c397c038fab0e3a917a12d5c5909e901" + integrity sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA== + +"@types/pbkdf2@^3.0.0": + version "3.1.2" + resolved "https://registry.yarnpkg.com/@types/pbkdf2/-/pbkdf2-3.1.2.tgz#2dc43808e9985a2c69ff02e2d2027bd4fe33e8dc" + integrity sha512-uRwJqmiXmh9++aSu1VNEn3iIxWOhd8AHXNSdlaLfdAAdSTY9jYVeGWnzejM3dvrkbqE3/hyQkQQ29IFATEGlew== + dependencies: + "@types/node" "*" + +"@types/readable-stream@^2.3.13": + version "2.3.15" + resolved "https://registry.yarnpkg.com/@types/readable-stream/-/readable-stream-2.3.15.tgz#3d79c9ceb1b6a57d5f6e6976f489b9b5384321ae" + integrity sha512-oM5JSKQCcICF1wvGgmecmHldZ48OZamtMxcGGVICOJA8o8cahXC1zEVAif8iwoc5j8etxFaRFnf095+CDsuoFQ== + dependencies: + "@types/node" "*" + safe-buffer "~5.1.1" + +"@types/secp256k1@^4.0.1": + version "4.0.6" + resolved "https://registry.yarnpkg.com/@types/secp256k1/-/secp256k1-4.0.6.tgz#d60ba2349a51c2cbc5e816dcd831a42029d376bf" + integrity sha512-hHxJU6PAEUn0TP4S/ZOzuTUvJWuZ6eIKeNKb5RBpODvSl6hp1Wrw4s7ATY50rklRCScUDpHzVA/DQdSjJ3UoYQ== + dependencies: + "@types/node" "*" + +"@types/seedrandom@3.0.1": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@types/seedrandom/-/seedrandom-3.0.1.tgz#1254750a4fec4aff2ebec088ccd0bb02e91fedb4" + integrity sha512-giB9gzDeiCeloIXDgzFBCgjj1k4WxcDrZtGl6h1IqmUPlxF+Nx8Ve+96QCyDZ/HseB/uvDsKbpib9hU5cU53pw== + +"@types/semver@^7.5.0": + version "7.5.7" + resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.7.tgz#326f5fdda70d13580777bcaa1bc6fa772a5aef0e" + integrity sha512-/wdoPq1QqkSj9/QOeKkFquEuPzQbHTWAMPH/PaUMB+JuR31lXhlWXRZ52IpfDYVlDOUBvX09uBrPwxGT1hjNBg== + +"@types/stack-utils@^2.0.0": + version "2.0.3" + resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.3.tgz#6209321eb2c1712a7e7466422b8cb1fc0d9dd5d8" + integrity sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw== + +"@types/triple-beam@^1.3.2": + version "1.3.5" + resolved "https://registry.yarnpkg.com/@types/triple-beam/-/triple-beam-1.3.5.tgz#74fef9ffbaa198eb8b588be029f38b00299caa2c" + integrity sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw== + +"@types/uuid@8.3.4": + version "8.3.4" + resolved "https://registry.yarnpkg.com/@types/uuid/-/uuid-8.3.4.tgz#bd86a43617df0594787d38b735f55c805becf1bc" + integrity sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw== + +"@types/yargs-parser@*": + version "21.0.3" + resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.3.tgz#815e30b786d2e8f0dcd85fd5bcf5e1a04d008f15" + integrity sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ== + +"@types/yargs@^17.0.8": + version "17.0.32" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.32.tgz#030774723a2f7faafebf645f4e5a48371dca6229" + integrity sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog== + dependencies: + "@types/yargs-parser" "*" + +"@typescript-eslint/eslint-plugin@^6.7.0": + version "6.21.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.21.0.tgz#30830c1ca81fd5f3c2714e524c4303e0194f9cd3" + integrity sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA== + dependencies: + "@eslint-community/regexpp" "^4.5.1" + "@typescript-eslint/scope-manager" "6.21.0" + "@typescript-eslint/type-utils" "6.21.0" + "@typescript-eslint/utils" "6.21.0" + "@typescript-eslint/visitor-keys" "6.21.0" + debug "^4.3.4" + graphemer "^1.4.0" + ignore "^5.2.4" + natural-compare "^1.4.0" + semver "^7.5.4" + ts-api-utils "^1.0.1" + +"@typescript-eslint/parser@^6.6.0": + version "6.21.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-6.21.0.tgz#af8fcf66feee2edc86bc5d1cf45e33b0630bf35b" + integrity sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ== + dependencies: + "@typescript-eslint/scope-manager" "6.21.0" + "@typescript-eslint/types" "6.21.0" + "@typescript-eslint/typescript-estree" "6.21.0" + "@typescript-eslint/visitor-keys" "6.21.0" + debug "^4.3.4" + +"@typescript-eslint/scope-manager@6.21.0": + version "6.21.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-6.21.0.tgz#ea8a9bfc8f1504a6ac5d59a6df308d3a0630a2b1" + integrity sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg== + dependencies: + "@typescript-eslint/types" "6.21.0" + "@typescript-eslint/visitor-keys" "6.21.0" + +"@typescript-eslint/type-utils@6.21.0": + version "6.21.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-6.21.0.tgz#6473281cfed4dacabe8004e8521cee0bd9d4c01e" + integrity sha512-rZQI7wHfao8qMX3Rd3xqeYSMCL3SoiSQLBATSiVKARdFGCYSRvmViieZjqc58jKgs8Y8i9YvVVhRbHSTA4VBag== + dependencies: + "@typescript-eslint/typescript-estree" "6.21.0" + "@typescript-eslint/utils" "6.21.0" + debug "^4.3.4" + ts-api-utils "^1.0.1" + +"@typescript-eslint/types@6.21.0": + version "6.21.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-6.21.0.tgz#205724c5123a8fef7ecd195075fa6e85bac3436d" + integrity sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg== + +"@typescript-eslint/typescript-estree@6.21.0": + version "6.21.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-6.21.0.tgz#c47ae7901db3b8bddc3ecd73daff2d0895688c46" + integrity sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ== + dependencies: + "@typescript-eslint/types" "6.21.0" + "@typescript-eslint/visitor-keys" "6.21.0" + debug "^4.3.4" + globby "^11.1.0" + is-glob "^4.0.3" + minimatch "9.0.3" + semver "^7.5.4" + ts-api-utils "^1.0.1" + +"@typescript-eslint/utils@6.21.0": + version "6.21.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-6.21.0.tgz#4714e7a6b39e773c1c8e97ec587f520840cd8134" + integrity sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ== + dependencies: + "@eslint-community/eslint-utils" "^4.4.0" + "@types/json-schema" "^7.0.12" + "@types/semver" "^7.5.0" + "@typescript-eslint/scope-manager" "6.21.0" + "@typescript-eslint/types" "6.21.0" + "@typescript-eslint/typescript-estree" "6.21.0" + semver "^7.5.4" + +"@typescript-eslint/visitor-keys@6.21.0": + version "6.21.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-6.21.0.tgz#87a99d077aa507e20e238b11d56cc26ade45fe47" + integrity sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A== + dependencies: + "@typescript-eslint/types" "6.21.0" + eslint-visitor-keys "^3.4.1" + +"@ungap/structured-clone@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.2.0.tgz#756641adb587851b5ccb3e095daf27ae581c8406" + integrity sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ== + +"@yarnpkg/lockfile@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz#e77a97fbd345b76d83245edcd17d393b1b41fb31" + integrity sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ== + +"@yarnpkg/parsers@3.0.0-rc.46": + version "3.0.0-rc.46" + resolved "https://registry.yarnpkg.com/@yarnpkg/parsers/-/parsers-3.0.0-rc.46.tgz#03f8363111efc0ea670e53b0282cd3ef62de4e01" + integrity sha512-aiATs7pSutzda/rq8fnuPwTglyVwjM22bNnK2ZgjrpAjQHSSl3lztd2f9evst1W/qnC58DRz7T7QndUDumAR4Q== + dependencies: + js-yaml "^3.10.0" + tslib "^2.4.0" + +"@zkochan/js-yaml@0.0.6": + version "0.0.6" + resolved "https://registry.yarnpkg.com/@zkochan/js-yaml/-/js-yaml-0.0.6.tgz#975f0b306e705e28b8068a07737fa46d3fc04826" + integrity sha512-nzvgl3VfhcELQ8LyVrYOru+UtAy1nrygk2+AGbTm8a5YcO6o8lSjAT+pfg3vJWxIoZKOUhrK6UU7xW/+00kQrg== + dependencies: + argparse "^2.0.1" + +JSONStream@^1.3.5: + version "1.3.5" + resolved "https://registry.yarnpkg.com/JSONStream/-/JSONStream-1.3.5.tgz#3208c1f08d3a4d99261ab64f92302bc15e111ca0" + integrity sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ== + dependencies: + jsonparse "^1.2.0" + through ">=2.2.7 <3" + +abbrev@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" + integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== + +abitype@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/abitype/-/abitype-1.0.0.tgz#237176dace81d90d018bebf3a45cb42f2a2d9e97" + integrity sha512-NMeMah//6bJ56H5XRj8QCV4AwuW6hB6zqz2LnhhLdcWVQOsXki6/Pn3APeqxCma62nXIcmZWdu1DlHWS74umVQ== + +abitype@^0.8.3: + version "0.8.11" + resolved "https://registry.yarnpkg.com/abitype/-/abitype-0.8.11.tgz#66e1cf2cbf46f48d0e57132d7c1c392447536cc1" + integrity sha512-bM4v2dKvX08sZ9IU38IN5BKmN+ZkOSd2oI4a9f0ejHYZQYV6cDr7j+d95ga0z2XHG36Y4jzoG5Z7qDqxp7fi/A== + +abstract-level@1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/abstract-level/-/abstract-level-1.0.3.tgz#78a67d3d84da55ee15201486ab44c09560070741" + integrity sha512-t6jv+xHy+VYwc4xqZMn2Pa9DjcdzvzZmQGRjTFc8spIbRGHgBrEKbPq+rYXc7CCo0lxgYvSgKVg9qZAhpVQSjA== + dependencies: + buffer "^6.0.3" + catering "^2.1.0" + is-buffer "^2.0.5" + level-supports "^4.0.0" + level-transcoder "^1.0.1" + module-error "^1.0.1" + queue-microtask "^1.2.3" + +abstract-level@^1.0.0, abstract-level@^1.0.2, abstract-level@^1.0.3, abstract-level@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/abstract-level/-/abstract-level-1.0.4.tgz#3ad8d684c51cc9cbc9cf9612a7100b716c414b57" + integrity sha512-eUP/6pbXBkMbXFdx4IH2fVgvB7M0JvR7/lIL33zcs0IBcwjdzSSl31TOJsaCzmKSSDF9h8QYSOJux4Nd4YJqFg== + dependencies: + buffer "^6.0.3" + catering "^2.1.0" + is-buffer "^2.0.5" + level-supports "^4.0.0" + level-transcoder "^1.0.1" + module-error "^1.0.1" + queue-microtask "^1.2.3" + +abstract-leveldown@7.2.0, abstract-leveldown@^7.2.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/abstract-leveldown/-/abstract-leveldown-7.2.0.tgz#08d19d4e26fb5be426f7a57004851b39e1795a2e" + integrity sha512-DnhQwcFEaYsvYDnACLZhMmCWd3rkOeEvglpa4q5i/5Jlm3UIsWaxVzuXvDLFCSCWRO3yy2/+V/G7FusFgejnfQ== + dependencies: + buffer "^6.0.3" + catering "^2.0.0" + is-buffer "^2.0.5" + level-concat-iterator "^3.0.0" + level-supports "^2.0.1" + queue-microtask "^1.2.3" + +acorn-jsx@^5.3.2: + version "5.3.2" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" + integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== + +acorn-walk@^8.1.1: + version "8.3.2" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.3.2.tgz#7703af9415f1b6db9315d6895503862e231d34aa" + integrity sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A== + +acorn@^8.4.1, acorn@^8.9.0: + version "8.11.3" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.11.3.tgz#71e0b14e13a4ec160724b38fb7b0f233b1b81d7a" + integrity sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg== + +add-stream@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/add-stream/-/add-stream-1.0.0.tgz#6a7990437ca736d5e1288db92bd3266d5f5cb2aa" + integrity sha512-qQLMr+8o0WC4FZGQTcJiKBVC59JylcPSrTtk6usvmIDFUOCKegapy1VHQwRbFMOFyb/inzUVqHs+eMYKDM1YeQ== + +adm-zip@^0.4.16: + version "0.4.16" + resolved "https://registry.yarnpkg.com/adm-zip/-/adm-zip-0.4.16.tgz#cf4c508fdffab02c269cbc7f471a875f05570365" + integrity sha512-TFi4HBKSGfIKsK5YCkKaaFG2m4PEDyViZmEwof3MTIgzimHLto6muaHVpbrljdIvIrFZzEq/p4nafOeLcYegrg== + +aes-js@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/aes-js/-/aes-js-3.0.0.tgz#e21df10ad6c2053295bcbb8dab40b09dbea87e4d" + integrity sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw== + +agent-base@6, agent-base@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" + integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== + dependencies: + debug "4" + +agentkeepalive@^4.1.3, agentkeepalive@^4.2.1: + version "4.5.0" + resolved "https://registry.yarnpkg.com/agentkeepalive/-/agentkeepalive-4.5.0.tgz#2673ad1389b3c418c5a20c5d7364f93ca04be923" + integrity sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew== + dependencies: + humanize-ms "^1.2.1" + +aggregate-error@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" + integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA== + dependencies: + clean-stack "^2.0.0" + indent-string "^4.0.0" + +ajv@^6.12.4: + version "6.12.6" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" + integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== + dependencies: + fast-deep-equal "^3.1.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + +ansi-align@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-3.0.1.tgz#0cdf12e111ace773a86e9a1fad1225c43cb19a59" + integrity sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w== + dependencies: + string-width "^4.1.0" + +ansi-colors@4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348" + integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA== + +ansi-colors@^4.1.1: + version "4.1.3" + resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.3.tgz#37611340eb2243e70cc604cad35d63270d48781b" + integrity sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw== + +ansi-escapes@^4.2.1, ansi-escapes@^4.3.0: + version "4.3.2" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" + integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== + dependencies: + type-fest "^0.21.3" + +ansi-regex@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== + +ansi-regex@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.0.1.tgz#3183e38fae9a65d7cb5e53945cd5897d0260a06a" + integrity sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA== + +ansi-sequence-parser@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/ansi-sequence-parser/-/ansi-sequence-parser-1.1.1.tgz#e0aa1cdcbc8f8bb0b5bca625aac41f5f056973cf" + integrity sha512-vJXt3yiaUL4UU546s3rPXlsry/RnM730G1+HkpKE012AN0sx1eOrxSu95oKDIonskeLTijMgqWZ3uDEe3NFvyg== + +ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== + dependencies: + color-convert "^1.9.0" + +ansi-styles@^4.0.0, ansi-styles@^4.1.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + +ansi-styles@^5.0.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-5.2.0.tgz#07449690ad45777d1924ac2abb2fc8895dba836b" + integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== + +ansi-styles@^6.1.0: + version "6.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5" + integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== + +any-promise@^1.0.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f" + integrity sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A== + +anymatch@^3.0.3, anymatch@~3.1.2: + version "3.1.3" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" + integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + +"aproba@^1.0.3 || ^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/aproba/-/aproba-2.0.0.tgz#52520b8ae5b569215b354efc0caa3fe1e45a8adc" + integrity sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ== + +are-we-there-yet@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz#679df222b278c64f2cdba1175cdc00b0d96164bd" + integrity sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg== + dependencies: + delegates "^1.0.0" + readable-stream "^3.6.0" + +arg@^4.1.0: + version "4.1.3" + resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" + integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== + +argparse@^1.0.7: + version "1.0.10" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" + integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== + dependencies: + sprintf-js "~1.0.2" + +argparse@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" + integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== + +args@5.0.3: + version "5.0.3" + resolved "https://registry.yarnpkg.com/args/-/args-5.0.3.tgz#943256db85021a85684be2f0882f25d796278702" + integrity sha512-h6k/zfFgusnv3i5TU08KQkVKuCPBtL/PWQbWkHUxvJrZ2nAyeaUupneemcrgn1xmqxPQsPIzwkUhOpoqPDRZuA== + dependencies: + camelcase "5.0.0" + chalk "2.4.2" + leven "2.1.0" + mri "1.1.4" + +array-buffer-byte-length@^1.0.0, array-buffer-byte-length@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz#1e5583ec16763540a27ae52eed99ff899223568f" + integrity sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg== + dependencies: + call-bind "^1.0.5" + is-array-buffer "^3.0.4" + +array-differ@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/array-differ/-/array-differ-3.0.0.tgz#3cbb3d0f316810eafcc47624734237d6aee4ae6b" + integrity sha512-THtfYS6KtME/yIAhKjZ2ul7XI96lQGHRputJQHO80LAWQnuGP4iCIN8vdMRboGbIEYBwU33q8Tch1os2+X0kMg== + +array-ify@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/array-ify/-/array-ify-1.0.0.tgz#9e528762b4a9066ad163a6962a364418e9626ece" + integrity sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng== + +array-includes@^3.1.7: + version "3.1.7" + resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.7.tgz#8cd2e01b26f7a3086cbc87271593fe921c62abda" + integrity sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + get-intrinsic "^1.2.1" + is-string "^1.0.7" + +array-union@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" + integrity sha512-Dxr6QJj/RdU/hCaBjOfxW+q6lyuVE6JFWIrAUpuOOhoJJoQ99cUn3igRaHVB5P9WrgFVN0FfArM3x0cueOU8ng== + dependencies: + array-uniq "^1.0.1" + +array-union@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" + integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== + +array-uniq@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" + integrity sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q== + +array.prototype.filter@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/array.prototype.filter/-/array.prototype.filter-1.0.3.tgz#423771edeb417ff5914111fff4277ea0624c0d0e" + integrity sha512-VizNcj/RGJiUyQBgzwxzE5oHdeuXY5hSbbmKMlphj1cy1Vl7Pn2asCGbSrru6hSQjmCzqTBPVWAF/whmEOVHbw== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + es-array-method-boxes-properly "^1.0.0" + is-string "^1.0.7" + +array.prototype.findlastindex@^1.2.3: + version "1.2.4" + resolved "https://registry.yarnpkg.com/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.4.tgz#d1c50f0b3a9da191981ff8942a0aedd82794404f" + integrity sha512-hzvSHUshSpCflDR1QMUBLHGHP1VIEBegT4pix9H/Z92Xw3ySoy6c2qh7lJWTJnRJ8JCZ9bJNCgTyYaJGcJu6xQ== + dependencies: + call-bind "^1.0.5" + define-properties "^1.2.1" + es-abstract "^1.22.3" + es-errors "^1.3.0" + es-shim-unscopables "^1.0.2" + +array.prototype.flat@^1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz#1476217df8cff17d72ee8f3ba06738db5b387d18" + integrity sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + es-shim-unscopables "^1.0.0" + +array.prototype.flatmap@^1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz#c9a7c6831db8e719d6ce639190146c24bbd3e527" + integrity sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + es-shim-unscopables "^1.0.0" + +arraybuffer.prototype.slice@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz#097972f4255e41bc3425e37dc3f6421cf9aefde6" + integrity sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A== + dependencies: + array-buffer-byte-length "^1.0.1" + call-bind "^1.0.5" + define-properties "^1.2.1" + es-abstract "^1.22.3" + es-errors "^1.2.1" + get-intrinsic "^1.2.3" + is-array-buffer "^3.0.4" + is-shared-array-buffer "^1.0.2" + +arrify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" + integrity sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA== + +arrify@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/arrify/-/arrify-2.0.1.tgz#c9655e9331e0abcd588d2a7cad7e9956f66701fa" + integrity sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug== + +async-eventemitter@0.2.4: + version "0.2.4" + resolved "https://registry.yarnpkg.com/async-eventemitter/-/async-eventemitter-0.2.4.tgz#f5e7c8ca7d3e46aab9ec40a292baf686a0bafaca" + integrity sha512-pd20BwL7Yt1zwDFy+8MX8F1+WCT8aQeKj0kQnTrH9WaeRETlRamVhD0JtRPmrV4GfOJ2F9CvdQkZeZhnh2TuHw== + dependencies: + async "^2.4.0" + +async@^2.4.0: + version "2.6.4" + resolved "https://registry.yarnpkg.com/async/-/async-2.6.4.tgz#706b7ff6084664cd7eae713f6f965433b5504221" + integrity sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA== + dependencies: + lodash "^4.17.14" + +async@^3.2.3, async@^3.2.4: + version "3.2.5" + resolved "https://registry.yarnpkg.com/async/-/async-3.2.5.tgz#ebd52a8fdaf7a2289a24df399f8d8485c8a46b66" + integrity sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg== + +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== + +available-typed-arrays@^1.0.5, available-typed-arrays@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.6.tgz#ac812d8ce5a6b976d738e1c45f08d0b00bc7d725" + integrity sha512-j1QzY8iPNPG4o4xmO3ptzpRxTciqD3MgEHtifP/YnJpIo58Xu+ne4BejlbkuaLfXn/nz6HFiw29bLpj2PNMdGg== + +axios@^1.0.0, axios@^1.3.6: + version "1.6.7" + resolved "https://registry.yarnpkg.com/axios/-/axios-1.6.7.tgz#7b48c2e27c96f9c68a2f8f31e2ab19f59b06b0a7" + integrity sha512-/hDJGff6/c7u0hDkvkGxR/oy6CbCs8ziCsC7SqmhjfozqiJGc8Z11wrv9z9lYfY4K8l+H9TpjcMDX0xOZmx+RA== + dependencies: + follow-redirects "^1.15.4" + form-data "^4.0.0" + proxy-from-env "^1.1.0" + +babel-jest@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-29.7.0.tgz#f4369919225b684c56085998ac63dbd05be020d5" + integrity sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg== + dependencies: + "@jest/transform" "^29.7.0" + "@types/babel__core" "^7.1.14" + babel-plugin-istanbul "^6.1.1" + babel-preset-jest "^29.6.3" + chalk "^4.0.0" + graceful-fs "^4.2.9" + slash "^3.0.0" + +babel-plugin-istanbul@^6.1.1: + version "6.1.1" + resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz#fa88ec59232fd9b4e36dbbc540a8ec9a9b47da73" + integrity sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@istanbuljs/load-nyc-config" "^1.0.0" + "@istanbuljs/schema" "^0.1.2" + istanbul-lib-instrument "^5.0.4" + test-exclude "^6.0.0" + +babel-plugin-jest-hoist@^29.6.3: + version "29.6.3" + resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz#aadbe943464182a8922c3c927c3067ff40d24626" + integrity sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg== + dependencies: + "@babel/template" "^7.3.3" + "@babel/types" "^7.3.3" + "@types/babel__core" "^7.1.14" + "@types/babel__traverse" "^7.0.6" + +babel-preset-current-node-syntax@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz#b4399239b89b2a011f9ddbe3e4f401fc40cff73b" + integrity sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ== + dependencies: + "@babel/plugin-syntax-async-generators" "^7.8.4" + "@babel/plugin-syntax-bigint" "^7.8.3" + "@babel/plugin-syntax-class-properties" "^7.8.3" + "@babel/plugin-syntax-import-meta" "^7.8.3" + "@babel/plugin-syntax-json-strings" "^7.8.3" + "@babel/plugin-syntax-logical-assignment-operators" "^7.8.3" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + "@babel/plugin-syntax-numeric-separator" "^7.8.3" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" + "@babel/plugin-syntax-top-level-await" "^7.8.3" + +babel-preset-jest@^29.6.3: + version "29.6.3" + resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz#fa05fa510e7d493896d7b0dd2033601c840f171c" + integrity sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA== + dependencies: + babel-plugin-jest-hoist "^29.6.3" + babel-preset-current-node-syntax "^1.0.0" + +balanced-match@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== + +base-x@^3.0.2: + version "3.0.9" + resolved "https://registry.yarnpkg.com/base-x/-/base-x-3.0.9.tgz#6349aaabb58526332de9f60995e548a53fe21320" + integrity sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ== + dependencies: + safe-buffer "^5.0.1" + +base64-js@^1.3.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" + integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== + +bech32@1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/bech32/-/bech32-1.1.4.tgz#e38c9f37bf179b8eb16ae3a772b40c356d4832e9" + integrity sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ== + +before-after-hook@^2.2.0: + version "2.2.3" + resolved "https://registry.yarnpkg.com/before-after-hook/-/before-after-hook-2.2.3.tgz#c51e809c81a4e354084422b9b26bad88249c517c" + integrity sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ== + +bigint-crypto-utils@^3.0.23: + version "3.3.0" + resolved "https://registry.yarnpkg.com/bigint-crypto-utils/-/bigint-crypto-utils-3.3.0.tgz#72ad00ae91062cf07f2b1def9594006c279c1d77" + integrity sha512-jOTSb+drvEDxEq6OuUybOAv/xxoh3cuYRUIPyu8sSHQNKM303UQ2R1DAo45o1AkcIXw6fzbaFI1+xGGdaXs2lg== + +bignumber.js@^9.0.1: + version "9.1.2" + resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-9.1.2.tgz#b7c4242259c008903b13707983b5f4bbd31eda0c" + integrity sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug== + +binary-extensions@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" + integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== + +bl@^4.0.3, bl@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a" + integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w== + dependencies: + buffer "^5.5.0" + inherits "^2.0.4" + readable-stream "^3.4.0" + +blakejs@^1.1.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/blakejs/-/blakejs-1.2.1.tgz#5057e4206eadb4a97f7c0b6e197a505042fc3814" + integrity sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ== + +bn.js@4.11.6: + version "4.11.6" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.6.tgz#53344adb14617a13f6e8dd2ce28905d1c0ba3215" + integrity sha512-XWwnNNFCuuSQ0m3r3C4LE3EiORltHd9M05pq6FOlVeiophzRbMo50Sbz1ehl8K3Z+jw9+vmgnXefY1hz8X+2wA== + +bn.js@^4.11.0, bn.js@^4.11.8, bn.js@^4.11.9: + version "4.12.0" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88" + integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== + +bn.js@^5.2.0, bn.js@^5.2.1: + version "5.2.1" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.1.tgz#0bc527a6a0d18d0aa8d5b0538ce4a77dccfa7b70" + integrity sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ== + +boxen@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/boxen/-/boxen-5.1.2.tgz#788cb686fc83c1f486dfa8a40c68fc2b831d2b50" + integrity sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ== + dependencies: + ansi-align "^3.0.0" + camelcase "^6.2.0" + chalk "^4.1.0" + cli-boxes "^2.2.1" + string-width "^4.2.2" + type-fest "^0.20.2" + widest-line "^3.1.0" + wrap-ansi "^7.0.0" + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +brace-expansion@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" + integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== + dependencies: + balanced-match "^1.0.0" + +braces@^3.0.2, braces@~3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" + integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== + dependencies: + fill-range "^7.0.1" + +brorand@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" + integrity sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w== + +browser-level@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/browser-level/-/browser-level-1.0.1.tgz#36e8c3183d0fe1c405239792faaab5f315871011" + integrity sha512-XECYKJ+Dbzw0lbydyQuJzwNXtOpbMSq737qxJN11sIRTErOMShvDpbzTlgju7orJKvx4epULolZAuJGLzCmWRQ== + dependencies: + abstract-level "^1.0.2" + catering "^2.1.1" + module-error "^1.0.2" + run-parallel-limit "^1.1.0" + +browser-stdout@1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" + integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw== + +browserify-aes@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48" + integrity sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA== + dependencies: + buffer-xor "^1.0.3" + cipher-base "^1.0.0" + create-hash "^1.1.0" + evp_bytestokey "^1.0.3" + inherits "^2.0.1" + safe-buffer "^5.0.1" + +browserslist@^4.22.2: + version "4.22.3" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.22.3.tgz#299d11b7e947a6b843981392721169e27d60c5a6" + integrity sha512-UAp55yfwNv0klWNapjs/ktHoguxuQNGnOzxYmfnXIS+8AsRDZkSDxg7R1AX3GKzn078SBI5dzwzj/Yx0Or0e3A== + dependencies: + caniuse-lite "^1.0.30001580" + electron-to-chromium "^1.4.648" + node-releases "^2.0.14" + update-browserslist-db "^1.0.13" + +bs-logger@0.x: + version "0.2.6" + resolved "https://registry.yarnpkg.com/bs-logger/-/bs-logger-0.2.6.tgz#eb7d365307a72cf974cc6cda76b68354ad336bd8" + integrity sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog== + dependencies: + fast-json-stable-stringify "2.x" + +bs58@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/bs58/-/bs58-4.0.1.tgz#be161e76c354f6f788ae4071f63f34e8c4f0a42a" + integrity sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw== + dependencies: + base-x "^3.0.2" + +bs58check@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/bs58check/-/bs58check-2.1.2.tgz#53b018291228d82a5aa08e7d796fdafda54aebfc" + integrity sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA== + dependencies: + bs58 "^4.0.0" + create-hash "^1.1.0" + safe-buffer "^5.1.2" + +bser@2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/bser/-/bser-2.1.1.tgz#e6787da20ece9d07998533cfd9de6f5c38f4bc05" + integrity sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ== + dependencies: + node-int64 "^0.4.0" + +buffer-from@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" + integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== + +buffer-reverse@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/buffer-reverse/-/buffer-reverse-1.0.1.tgz#49283c8efa6f901bc01fa3304d06027971ae2f60" + integrity sha512-M87YIUBsZ6N924W57vDwT/aOu8hw7ZgdByz6ijksLjmHJELBASmYTTlNHRgjE+pTsT9oJXGaDSgqqwfdHotDUg== + +buffer-xor@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" + integrity sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ== + +buffer@^5.5.0: + version "5.7.1" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" + integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== + dependencies: + base64-js "^1.3.1" + ieee754 "^1.1.13" + +buffer@^6.0.3: + version "6.0.3" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-6.0.3.tgz#2ace578459cc8fbe2a70aaa8f52ee63b6a74c6c6" + integrity sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA== + dependencies: + base64-js "^1.3.1" + ieee754 "^1.2.1" + +bufferutil@4.0.5: + version "4.0.5" + resolved "https://registry.yarnpkg.com/bufferutil/-/bufferutil-4.0.5.tgz#da9ea8166911cc276bf677b8aed2d02d31f59028" + integrity sha512-HTm14iMQKK2FjFLRTM5lAVcyaUzOnqbPtesFIvREgXpJHdQm8bWS+GkQgIkfaBYRHuCnea7w8UVNfwiAQhlr9A== + dependencies: + node-gyp-build "^4.3.0" + +bufferutil@4.0.7: + version "4.0.7" + resolved "https://registry.yarnpkg.com/bufferutil/-/bufferutil-4.0.7.tgz#60c0d19ba2c992dd8273d3f73772ffc894c153ad" + integrity sha512-kukuqc39WOHtdxtw4UScxF/WVnMFVSQVKhtx3AjZJzhd0RGZZldcrfSEbVsWWe6KNH253574cq5F+wpv0G9pJw== + dependencies: + node-gyp-build "^4.3.0" + +builtins@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/builtins/-/builtins-1.0.3.tgz#cb94faeb61c8696451db36534e1422f94f0aee88" + integrity sha512-uYBjakWipfaO/bXI7E8rq6kpwHRZK5cNYrUv2OzZSI/FvmdMyXJ2tG9dKcjEC5YHmHpUAwsargWIZNWdxb/bnQ== + +builtins@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/builtins/-/builtins-5.0.1.tgz#87f6db9ab0458be728564fa81d876d8d74552fa9" + integrity sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ== + dependencies: + semver "^7.0.0" + +byte-size@8.1.1: + version "8.1.1" + resolved "https://registry.yarnpkg.com/byte-size/-/byte-size-8.1.1.tgz#3424608c62d59de5bfda05d31e0313c6174842ae" + integrity sha512-tUkzZWK0M/qdoLEqikxBWe4kumyuwjl3HO6zHTr4yEI23EojPtLYXdG1+AQY7MN0cGyNDvEaJ8wiYQm6P2bPxg== + +bytes@3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" + integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== + +cacache@^15.2.0: + version "15.3.0" + resolved "https://registry.yarnpkg.com/cacache/-/cacache-15.3.0.tgz#dc85380fb2f556fe3dda4c719bfa0ec875a7f1eb" + integrity sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ== + dependencies: + "@npmcli/fs" "^1.0.0" + "@npmcli/move-file" "^1.0.1" + chownr "^2.0.0" + fs-minipass "^2.0.0" + glob "^7.1.4" + infer-owner "^1.0.4" + lru-cache "^6.0.0" + minipass "^3.1.1" + minipass-collect "^1.0.2" + minipass-flush "^1.0.5" + minipass-pipeline "^1.2.2" + mkdirp "^1.0.3" + p-map "^4.0.0" + promise-inflight "^1.0.1" + rimraf "^3.0.2" + ssri "^8.0.1" + tar "^6.0.2" + unique-filename "^1.1.1" + +cacache@^16.1.0: + version "16.1.3" + resolved "https://registry.yarnpkg.com/cacache/-/cacache-16.1.3.tgz#a02b9f34ecfaf9a78c9f4bc16fceb94d5d67a38e" + integrity sha512-/+Emcj9DAXxX4cwlLmRI9c166RuL3w30zp4R7Joiv2cQTtTtA+jeuCAjH3ZlGnYS3tKENSrKhAzVVP9GVyzeYQ== + dependencies: + "@npmcli/fs" "^2.1.0" + "@npmcli/move-file" "^2.0.0" + chownr "^2.0.0" + fs-minipass "^2.1.0" + glob "^8.0.1" + infer-owner "^1.0.4" + lru-cache "^7.7.1" + minipass "^3.1.6" + minipass-collect "^1.0.2" + minipass-flush "^1.0.5" + minipass-pipeline "^1.2.4" + mkdirp "^1.0.4" + p-map "^4.0.0" + promise-inflight "^1.0.1" + rimraf "^3.0.2" + ssri "^9.0.0" + tar "^6.1.11" + unique-filename "^2.0.0" + +cacache@^17.0.0: + version "17.1.4" + resolved "https://registry.yarnpkg.com/cacache/-/cacache-17.1.4.tgz#b3ff381580b47e85c6e64f801101508e26604b35" + integrity sha512-/aJwG2l3ZMJ1xNAnqbMpA40of9dj/pIH3QfiuQSqjfPJF747VR0J/bHn+/KdNnHKc6XQcWt/AfRSBft82W1d2A== + dependencies: + "@npmcli/fs" "^3.1.0" + fs-minipass "^3.0.0" + glob "^10.2.2" + lru-cache "^7.7.1" + minipass "^7.0.3" + minipass-collect "^1.0.2" + minipass-flush "^1.0.5" + minipass-pipeline "^1.2.4" + p-map "^4.0.0" + ssri "^10.0.0" + tar "^6.1.11" + unique-filename "^3.0.0" + +call-bind@^1.0.2, call-bind@^1.0.5, call-bind@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.6.tgz#6c46675fc7a5e9de82d75a233d586c8b7ac0d931" + integrity sha512-Mj50FLHtlsoVfRfnHaZvyrooHcrlceNZdL/QBvJJVd9Ta55qCQK0gs4ss2oZDeV9zFCs6ewzYgVE5yfVmfFpVg== + dependencies: + es-errors "^1.3.0" + function-bind "^1.1.2" + get-intrinsic "^1.2.3" + set-function-length "^1.2.0" + +callsites@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" + integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== + +camelcase-keys@^6.2.2: + version "6.2.2" + resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-6.2.2.tgz#5e755d6ba51aa223ec7d3d52f25778210f9dc3c0" + integrity sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg== + dependencies: + camelcase "^5.3.1" + map-obj "^4.0.0" + quick-lru "^4.0.1" + +camelcase@5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.0.0.tgz#03295527d58bd3cd4aa75363f35b2e8d97be2f42" + integrity sha512-faqwZqnWxbxn+F1d399ygeamQNy3lPp/H9H6rNrqYh4FSVCtcY+3cub1MxA8o9mDd55mM8Aghuu/kuyYA6VTsA== + +camelcase@^5.3.1: + version "5.3.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" + integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== + +camelcase@^6.0.0, camelcase@^6.2.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" + integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== + +caniuse-lite@^1.0.30001580: + version "1.0.30001587" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001587.tgz#a0bce920155fa56a1885a69c74e1163fc34b4881" + integrity sha512-HMFNotUmLXn71BQxg8cijvqxnIAofforZOwGsxyXJ0qugTdspUF4sPSJ2vhgprHCB996tIDzEq1ubumPDV8ULA== + +case@^1.6.3: + version "1.6.3" + resolved "https://registry.yarnpkg.com/case/-/case-1.6.3.tgz#0a4386e3e9825351ca2e6216c60467ff5f1ea1c9" + integrity sha512-mzDSXIPaFwVDvZAHqZ9VlbyF4yyXRuX6IvB06WvPYkqJVO24kX1PPhv9bfpKNFZyxYFmmgo03HUiD8iklmJYRQ== + +catering@^2.0.0, catering@^2.1.0, catering@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/catering/-/catering-2.1.1.tgz#66acba06ed5ee28d5286133982a927de9a04b510" + integrity sha512-K7Qy8O9p76sL3/3m7/zLKbRkyOlSZAgzEaLhyj2mXS8PsCud2Eo4hAb8aLtZqHh0QGqLcb9dlJSu6lHRVENm1w== + +chalk@2.4.2, chalk@^2.4.2: + version "2.4.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + +chalk@4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.0.tgz#4e14870a618d9e2edd97dd8345fd9d9dc315646a" + integrity sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +chalk@^4.0.0, chalk@^4.0.2, chalk@^4.1.0, chalk@^4.1.1, chalk@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +char-regex@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/char-regex/-/char-regex-1.0.2.tgz#d744358226217f981ed58f479b1d6bcc29545dcf" + integrity sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw== + +chardet@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" + integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== + +chokidar@3.5.3: + version "3.5.3" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" + integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== + dependencies: + anymatch "~3.1.2" + braces "~3.0.2" + glob-parent "~5.1.2" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.6.0" + optionalDependencies: + fsevents "~2.3.2" + +chokidar@^3.4.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.6.0.tgz#197c6cc669ef2a8dc5e7b4d97ee4e092c3eb0d5b" + integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw== + dependencies: + anymatch "~3.1.2" + braces "~3.0.2" + glob-parent "~5.1.2" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.6.0" + optionalDependencies: + fsevents "~2.3.2" + +chownr@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-2.0.0.tgz#15bfbe53d2eab4cf70f18a8cd68ebe5b3cb1dece" + integrity sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ== + +ci-info@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" + integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== + +ci-info@^3.2.0, ci-info@^3.6.1: + version "3.9.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.9.0.tgz#4279a62028a7b1f262f3473fc9605f5e218c59b4" + integrity sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ== + +cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" + integrity sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q== + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + +cjs-module-lexer@^1.0.0: + version "1.2.3" + resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz#6c370ab19f8a3394e318fe682686ec0ac684d107" + integrity sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ== + +classic-level@^1.2.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/classic-level/-/classic-level-1.4.1.tgz#169ecf9f9c6200ad42a98c8576af449c1badbaee" + integrity sha512-qGx/KJl3bvtOHrGau2WklEZuXhS3zme+jf+fsu6Ej7W7IP/C49v7KNlWIsT1jZu0YnfzSIYDGcEWpCa1wKGWXQ== + dependencies: + abstract-level "^1.0.2" + catering "^2.1.0" + module-error "^1.0.1" + napi-macros "^2.2.2" + node-gyp-build "^4.3.0" + +clean-stack@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" + integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== + +cli-boxes@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-2.2.1.tgz#ddd5035d25094fce220e9cab40a45840a440318f" + integrity sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw== + +cli-cursor@3.1.0, cli-cursor@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" + integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== + dependencies: + restore-cursor "^3.1.0" + +cli-highlight@^2.1.11: + version "2.1.11" + resolved "https://registry.yarnpkg.com/cli-highlight/-/cli-highlight-2.1.11.tgz#49736fa452f0aaf4fae580e30acb26828d2dc1bf" + integrity sha512-9KDcoEVwyUXrjcJNvHD0NFc/hiwe/WPVYIleQh2O1N2Zro5gWJZ/K+3DGn8w8P/F6FxOgzyC5bxDyHIgCSPhGg== + dependencies: + chalk "^4.0.0" + highlight.js "^10.7.1" + mz "^2.4.0" + parse5 "^5.1.1" + parse5-htmlparser2-tree-adapter "^6.0.0" + yargs "^16.0.0" + +cli-spinners@2.6.1: + version "2.6.1" + resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.6.1.tgz#adc954ebe281c37a6319bfa401e6dd2488ffb70d" + integrity sha512-x/5fWmGMnbKQAaNwN+UZlV79qBLM9JFnJuJ03gIi5whrob0xV0ofNVHy9DhwGdsMJQc2OKv0oGmLzvaqvAVv+g== + +cli-spinners@^2.5.0: + version "2.9.2" + resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.9.2.tgz#1773a8f4b9c4d6ac31563df53b3fc1d79462fe41" + integrity sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg== + +cli-width@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-3.0.0.tgz#a2f48437a2caa9a22436e794bf071ec9e61cedf6" + integrity sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw== + +cliui@^7.0.2: + version "7.0.4" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" + integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.0" + wrap-ansi "^7.0.0" + +cliui@^8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa" + integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.1" + wrap-ansi "^7.0.0" + +clone-deep@4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-4.0.1.tgz#c19fd9bdbbf85942b4fd979c84dcf7d5f07c2387" + integrity sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ== + dependencies: + is-plain-object "^2.0.4" + kind-of "^6.0.2" + shallow-clone "^3.0.0" + +clone@^1.0.2: + version "1.0.4" + resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" + integrity sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg== + +cmd-shim@6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/cmd-shim/-/cmd-shim-6.0.1.tgz#a65878080548e1dca760b3aea1e21ed05194da9d" + integrity sha512-S9iI9y0nKR4hwEQsVWpyxld/6kRfGepGfzff83FcaiEBpmvlbA2nnGe7Cylgrx2f/p1P5S5wpRm9oL8z1PbS3Q== + +co@^4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" + integrity sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ== + +collect-v8-coverage@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz#c0b29bcd33bcd0779a1344c2136051e6afd3d9e9" + integrity sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q== + +color-convert@^1.9.0, color-convert@^1.9.3: + version "1.9.3" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== + dependencies: + color-name "1.1.3" + +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== + +color-name@^1.0.0, color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +color-string@^1.6.0: + version "1.9.1" + resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.9.1.tgz#4467f9146f036f855b764dfb5bf8582bf342c7a4" + integrity sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg== + dependencies: + color-name "^1.0.0" + simple-swizzle "^0.2.2" + +color-support@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-support/-/color-support-1.1.3.tgz#93834379a1cc9a0c61f82f52f0d04322251bd5a2" + integrity sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg== + +color@^3.1.3: + version "3.2.1" + resolved "https://registry.yarnpkg.com/color/-/color-3.2.1.tgz#3544dc198caf4490c3ecc9a790b54fe9ff45e164" + integrity sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA== + dependencies: + color-convert "^1.9.3" + color-string "^1.6.0" + +colorspace@1.1.x: + version "1.1.4" + resolved "https://registry.yarnpkg.com/colorspace/-/colorspace-1.1.4.tgz#8d442d1186152f60453bf8070cd66eb364e59243" + integrity sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w== + dependencies: + color "^3.1.3" + text-hex "1.0.x" + +columnify@1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/columnify/-/columnify-1.6.0.tgz#6989531713c9008bb29735e61e37acf5bd553cf3" + integrity sha512-lomjuFZKfM6MSAnV9aCZC9sc0qGbmZdfygNv+nCpqVkSKdCxCklLtd16O0EILGkImHw9ZpHkAnHaB+8Zxq5W6Q== + dependencies: + strip-ansi "^6.0.1" + wcwidth "^1.0.0" + +combined-stream@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" + integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== + dependencies: + delayed-stream "~1.0.0" + +command-exists@^1.2.8: + version "1.2.9" + resolved "https://registry.yarnpkg.com/command-exists/-/command-exists-1.2.9.tgz#c50725af3808c8ab0260fd60b01fbfa25b954f69" + integrity sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w== + +commander@3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/commander/-/commander-3.0.2.tgz#6837c3fb677ad9933d1cfba42dd14d5117d6b39e" + integrity sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow== + +commander@^11.0.0: + version "11.1.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-11.1.0.tgz#62fdce76006a68e5c1ab3314dc92e800eb83d906" + integrity sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ== + +commander@^2.9.0: + version "2.20.3" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" + integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== + +commondir@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" + integrity sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg== + +compare-func@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/compare-func/-/compare-func-2.0.0.tgz#fb65e75edbddfd2e568554e8b5b05fff7a51fcb3" + integrity sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA== + dependencies: + array-ify "^1.0.0" + dot-prop "^5.1.0" + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== + +concat-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-2.0.0.tgz#414cf5af790a48c60ab9be4527d56d5e41133cb1" + integrity sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A== + dependencies: + buffer-from "^1.0.0" + inherits "^2.0.3" + readable-stream "^3.0.2" + typedarray "^0.0.6" + +concurrently@^8.2.2: + version "8.2.2" + resolved "https://registry.yarnpkg.com/concurrently/-/concurrently-8.2.2.tgz#353141985c198cfa5e4a3ef90082c336b5851784" + integrity sha512-1dP4gpXFhei8IOtlXRE/T/4H88ElHgTiUzh71YUmtjTEHMSRS2Z/fgOxHSxxusGHogsRfxNq1vyAwxSC+EVyDg== + dependencies: + chalk "^4.1.2" + date-fns "^2.30.0" + lodash "^4.17.21" + rxjs "^7.8.1" + shell-quote "^1.8.1" + spawn-command "0.0.2" + supports-color "^8.1.1" + tree-kill "^1.2.2" + yargs "^17.7.2" + +confusing-browser-globals@^1.0.10: + version "1.0.11" + resolved "https://registry.yarnpkg.com/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz#ae40e9b57cdd3915408a2805ebd3a5585608dc81" + integrity sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA== + +console-control-strings@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" + integrity sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ== + +conventional-changelog-angular@7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/conventional-changelog-angular/-/conventional-changelog-angular-7.0.0.tgz#5eec8edbff15aa9b1680a8dcfbd53e2d7eb2ba7a" + integrity sha512-ROjNchA9LgfNMTTFSIWPzebCwOGFdgkEq45EnvvrmSLvCtAw0HSmrCs7/ty+wAeYUZyNay0YMUNYFTRL72PkBQ== + dependencies: + compare-func "^2.0.0" + +conventional-changelog-core@5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/conventional-changelog-core/-/conventional-changelog-core-5.0.1.tgz#3c331b155d5b9850f47b4760aeddfc983a92ad49" + integrity sha512-Rvi5pH+LvgsqGwZPZ3Cq/tz4ty7mjijhr3qR4m9IBXNbxGGYgTVVO+duXzz9aArmHxFtwZ+LRkrNIMDQzgoY4A== + dependencies: + add-stream "^1.0.0" + conventional-changelog-writer "^6.0.0" + conventional-commits-parser "^4.0.0" + dateformat "^3.0.3" + get-pkg-repo "^4.2.1" + git-raw-commits "^3.0.0" + git-remote-origin-url "^2.0.0" + git-semver-tags "^5.0.0" + normalize-package-data "^3.0.3" + read-pkg "^3.0.0" + read-pkg-up "^3.0.0" + +conventional-changelog-preset-loader@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/conventional-changelog-preset-loader/-/conventional-changelog-preset-loader-3.0.0.tgz#14975ef759d22515d6eabae6396c2ae721d4c105" + integrity sha512-qy9XbdSLmVnwnvzEisjxdDiLA4OmV3o8db+Zdg4WiFw14fP3B6XNz98X0swPPpkTd/pc1K7+adKgEDM1JCUMiA== + +conventional-changelog-writer@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/conventional-changelog-writer/-/conventional-changelog-writer-6.0.1.tgz#d8d3bb5e1f6230caed969dcc762b1c368a8f7b01" + integrity sha512-359t9aHorPw+U+nHzUXHS5ZnPBOizRxfQsWT5ZDHBfvfxQOAik+yfuhKXG66CN5LEWPpMNnIMHUTCKeYNprvHQ== + dependencies: + conventional-commits-filter "^3.0.0" + dateformat "^3.0.3" + handlebars "^4.7.7" + json-stringify-safe "^5.0.1" + meow "^8.1.2" + semver "^7.0.0" + split "^1.0.1" + +conventional-commits-filter@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/conventional-commits-filter/-/conventional-commits-filter-3.0.0.tgz#bf1113266151dd64c49cd269e3eb7d71d7015ee2" + integrity sha512-1ymej8b5LouPx9Ox0Dw/qAO2dVdfpRFq28e5Y0jJEU8ZrLdy0vOSkkIInwmxErFGhg6SALro60ZrwYFVTUDo4Q== + dependencies: + lodash.ismatch "^4.4.0" + modify-values "^1.0.1" + +conventional-commits-parser@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/conventional-commits-parser/-/conventional-commits-parser-4.0.0.tgz#02ae1178a381304839bce7cea9da5f1b549ae505" + integrity sha512-WRv5j1FsVM5FISJkoYMR6tPk07fkKT0UodruX4je86V4owk451yjXAKzKAPOs9l7y59E2viHUS9eQ+dfUA9NSg== + dependencies: + JSONStream "^1.3.5" + is-text-path "^1.0.1" + meow "^8.1.2" + split2 "^3.2.2" + +conventional-recommended-bump@7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/conventional-recommended-bump/-/conventional-recommended-bump-7.0.1.tgz#ec01f6c7f5d0e2491c2d89488b0d757393392424" + integrity sha512-Ft79FF4SlOFvX4PkwFDRnaNiIVX7YbmqGU0RwccUaiGvgp3S0a8ipR2/Qxk31vclDNM+GSdJOVs2KrsUCjblVA== + dependencies: + concat-stream "^2.0.0" + conventional-changelog-preset-loader "^3.0.0" + conventional-commits-filter "^3.0.0" + conventional-commits-parser "^4.0.0" + git-raw-commits "^3.0.0" + git-semver-tags "^5.0.0" + meow "^8.1.2" + +convert-source-map@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a" + integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== + +cookie@^0.4.1: + version "0.4.2" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.2.tgz#0e41f24de5ecf317947c82fc789e06a884824432" + integrity sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA== + +core-util-is@~1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" + integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== + +cosmiconfig@^8.2.0: + version "8.3.6" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-8.3.6.tgz#060a2b871d66dba6c8538ea1118ba1ac16f5fae3" + integrity sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA== + dependencies: + import-fresh "^3.3.0" + js-yaml "^4.1.0" + parse-json "^5.2.0" + path-type "^4.0.0" + +crc-32@^1.2.0: + version "1.2.2" + resolved "https://registry.yarnpkg.com/crc-32/-/crc-32-1.2.2.tgz#3cad35a934b8bf71f25ca524b6da51fb7eace2ff" + integrity sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ== + +create-hash@^1.1.0, create-hash@^1.1.2, create-hash@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196" + integrity sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg== + dependencies: + cipher-base "^1.0.1" + inherits "^2.0.1" + md5.js "^1.3.4" + ripemd160 "^2.0.1" + sha.js "^2.4.0" + +create-hmac@^1.1.4, create-hmac@^1.1.7: + version "1.1.7" + resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff" + integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg== + dependencies: + cipher-base "^1.0.3" + create-hash "^1.1.0" + inherits "^2.0.1" + ripemd160 "^2.0.0" + safe-buffer "^5.0.1" + sha.js "^2.4.8" + +create-jest@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/create-jest/-/create-jest-29.7.0.tgz#a355c5b3cb1e1af02ba177fe7afd7feee49a5320" + integrity sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q== + dependencies: + "@jest/types" "^29.6.3" + chalk "^4.0.0" + exit "^0.1.2" + graceful-fs "^4.2.9" + jest-config "^29.7.0" + jest-util "^29.7.0" + prompts "^2.0.1" + +create-require@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" + integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== + +cross-spawn@^7.0.0, cross-spawn@^7.0.2, cross-spawn@^7.0.3: + version "7.0.3" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" + integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + +crypto-js@^4.1.1, crypto-js@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/crypto-js/-/crypto-js-4.2.0.tgz#4d931639ecdfd12ff80e8186dba6af2c2e856631" + integrity sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q== + +dargs@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/dargs/-/dargs-7.0.0.tgz#04015c41de0bcb69ec84050f3d9be0caf8d6d5cc" + integrity sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg== + +date-fns@^2.30.0: + version "2.30.0" + resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.30.0.tgz#f367e644839ff57894ec6ac480de40cae4b0f4d0" + integrity sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw== + dependencies: + "@babel/runtime" "^7.21.0" + +dateformat@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-3.0.3.tgz#a6e37499a4d9a9cf85ef5872044d62901c9889ae" + integrity sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q== + +debug@4, debug@4.3.4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.3, debug@^4.3.4: + version "4.3.4" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" + integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== + dependencies: + ms "2.1.2" + +debug@^3.2.7: + version "3.2.7" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" + integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== + dependencies: + ms "^2.1.1" + +decamelize-keys@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/decamelize-keys/-/decamelize-keys-1.1.1.tgz#04a2d523b2f18d80d0158a43b895d56dff8d19d8" + integrity sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg== + dependencies: + decamelize "^1.1.0" + map-obj "^1.0.0" + +decamelize@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" + integrity sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA== + +decamelize@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-4.0.0.tgz#aa472d7bf660eb15f3494efd531cab7f2a709837" + integrity sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ== + +decode-uri-component@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.4.1.tgz#2ac4859663c704be22bf7db760a1494a49ab2cc5" + integrity sha512-+8VxcR21HhTy8nOt6jf20w0c9CADrw1O8d+VZ/YzzCt4bJ3uBjw+D1q2osAB8RnpwwaeYBxy0HyKQxD5JBMuuQ== + +dedent@0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c" + integrity sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA== + +dedent@^1.0.0: + version "1.5.1" + resolved "https://registry.yarnpkg.com/dedent/-/dedent-1.5.1.tgz#4f3fc94c8b711e9bb2800d185cd6ad20f2a90aff" + integrity sha512-+LxW+KLWxu3HW3M2w2ympwtqPrqYRzU8fqi6Fhd18fBALe15blJPI/I4+UHveMVG6lJqB4JNd4UG0S5cnVHwIg== + +deep-is@^0.1.3: + version "0.1.4" + resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" + integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== + +deepmerge@^4.2.2: + version "4.3.1" + resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.1.tgz#44b5f2147cd3b00d4b56137685966f26fd25dd4a" + integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A== + +defaults@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.4.tgz#b0b02062c1e2aa62ff5d9528f0f98baa90978d7a" + integrity sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A== + dependencies: + clone "^1.0.2" + +define-data-property@^1.0.1, define-data-property@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.2.tgz#f3c33b4f0102360cd7c0f5f28700f5678510b63a" + integrity sha512-SRtsSqsDbgpJBbW3pABMCOt6rQyeM8s8RiyeSN8jYG8sYmt/kGJejbydttUsnDs1tadr19tvhT4ShwMyoqAm4g== + dependencies: + es-errors "^1.3.0" + get-intrinsic "^1.2.2" + gopd "^1.0.1" + has-property-descriptors "^1.0.1" + +define-lazy-prop@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz#3f7ae421129bcaaac9bc74905c98a0009ec9ee7f" + integrity sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og== + +define-properties@^1.1.3, define-properties@^1.2.0, define-properties@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.1.tgz#10781cc616eb951a80a034bafcaa7377f6af2b6c" + integrity sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg== + dependencies: + define-data-property "^1.0.1" + has-property-descriptors "^1.0.0" + object-keys "^1.1.1" + +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== + +delegates@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" + integrity sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ== + +depd@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" + integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== + +deprecation@^2.0.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/deprecation/-/deprecation-2.3.1.tgz#6368cbdb40abf3373b525ac87e4a260c3a700919" + integrity sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ== + +detect-file@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/detect-file/-/detect-file-1.0.0.tgz#f0d66d03672a825cb1b73bdb3fe62310c8e552b7" + integrity sha512-DtCOLG98P007x7wiiOmfI0fi3eIKyWiLTGJ2MDnVi/E04lWGbf+JzrRHMm0rgIIZJGtHpKpbVgLWHrv8xXpc3Q== + +detect-indent@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-5.0.0.tgz#3871cc0a6a002e8c3e5b3cf7f336264675f06b9d" + integrity sha512-rlpvsxUtM0PQvy9iZe640/IWwWYyBsTApREbA1pHOpmOUIl9MkP/U4z7vTtg4Oaojvqhxt7sdufnT0EzGaR31g== + +detect-newline@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-3.1.0.tgz#576f5dfc63ae1a192ff192d8ad3af6308991b651" + integrity sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA== + +diff-sequences@^29.6.3: + version "29.6.3" + resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-29.6.3.tgz#4deaf894d11407c51efc8418012f9e70b84ea921" + integrity sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q== + +diff@5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/diff/-/diff-5.0.0.tgz#7ed6ad76d859d030787ec35855f5b1daf31d852b" + integrity sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w== + +diff@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" + integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== + +dir-glob@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" + integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== + dependencies: + path-type "^4.0.0" + +doctrine@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" + integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== + dependencies: + esutils "^2.0.2" + +doctrine@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" + integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== + dependencies: + esutils "^2.0.2" + +dot-prop@^5.1.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-5.3.0.tgz#90ccce708cd9cd82cc4dc8c3ddd9abdd55b20e88" + integrity sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q== + dependencies: + is-obj "^2.0.0" + +dotenv-expand@~10.0.0: + version "10.0.0" + resolved "https://registry.yarnpkg.com/dotenv-expand/-/dotenv-expand-10.0.0.tgz#12605d00fb0af6d0a592e6558585784032e4ef37" + integrity sha512-GopVGCpVS1UKH75VKHGuQFqS1Gusej0z4FyQkPdwjil2gNIv+LNsqBlboOzpJFZKVT95GkCyWJbBSdFEFUWI2A== + +dotenv@~16.3.1: + version "16.3.2" + resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.3.2.tgz#3cb611ce5a63002dbabf7c281bc331f69d28f03f" + integrity sha512-HTlk5nmhkm8F6JcdXvHIzaorzCoziNQT9mGxLPVXW8wJF1TiGSL60ZGB4gHWabHOaMmWmhvk2/lPHfnBiT78AQ== + +draggabilly@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/draggabilly/-/draggabilly-3.0.0.tgz#48defe10a67f346a0338caaa40c0765c4d3912d6" + integrity sha512-aEs+B6prbMZQMxc9lgTpCBfyCUhRur/VFucHhIOvlvvdARTj7TcDmX/cdOUtqbjJJUh7+agyJXR5Z6IFe1MxwQ== + dependencies: + get-size "^3.0.0" + unidragger "^3.0.0" + +duplexer@^0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.2.tgz#3abe43aef3835f8ae077d136ddce0f276b0400e6" + integrity sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg== + +eastasianwidth@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb" + integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== + +ejs@^3.1.7: + version "3.1.9" + resolved "https://registry.yarnpkg.com/ejs/-/ejs-3.1.9.tgz#03c9e8777fe12686a9effcef22303ca3d8eeb361" + integrity sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ== + dependencies: + jake "^10.8.5" + +electron-to-chromium@^1.4.648: + version "1.4.665" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.665.tgz#681700bd590b0e5a3be66e3e2874ce62abcf5da5" + integrity sha512-UpyCWObBoD+nSZgOC2ToaIdZB0r9GhqT2WahPKiSki6ckkSuKhQNso8V2PrFcHBMleI/eqbKgVQgVC4Wni4ilw== + +elliptic@6.5.4, elliptic@^6.5.2, elliptic@^6.5.4: + version "6.5.4" + resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.4.tgz#da37cebd31e79a1367e941b592ed1fbebd58abbb" + integrity sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ== + dependencies: + bn.js "^4.11.9" + brorand "^1.1.0" + hash.js "^1.0.0" + hmac-drbg "^1.0.1" + inherits "^2.0.4" + minimalistic-assert "^1.0.1" + minimalistic-crypto-utils "^1.0.1" + +email-addresses@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/email-addresses/-/email-addresses-5.0.0.tgz#7ae9e7f58eef7d5e3e2c2c2d3ea49b78dc854fa6" + integrity sha512-4OIPYlA6JXqtVn8zpHpGiI7vE6EQOAg16aGnDMIAlZVinnoZ8208tW1hAbjWydgN/4PLTT9q+O1K6AH/vALJGw== + +emittery@0.10.0: + version "0.10.0" + resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.10.0.tgz#bb373c660a9d421bb44706ec4967ed50c02a8026" + integrity sha512-AGvFfs+d0JKCJQ4o01ASQLGPmSCxgfU9RFXvzPvZdjKK8oscynksuJhWrSTSw7j7Ep/sZct5b5ZhYCi8S/t0HQ== + +emittery@^0.13.1: + version "0.13.1" + resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.13.1.tgz#c04b8c3457490e0847ae51fced3af52d338e3dad" + integrity sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ== + +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + +emoji-regex@^9.2.2: + version "9.2.2" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" + integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== + +enabled@2.0.x: + version "2.0.0" + resolved "https://registry.yarnpkg.com/enabled/-/enabled-2.0.0.tgz#f9dd92ec2d6f4bbc0d5d1e64e21d61cd4665e7c2" + integrity sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ== + +encoding@^0.1.12, encoding@^0.1.13: + version "0.1.13" + resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.13.tgz#56574afdd791f54a8e9b2785c0582a2d26210fa9" + integrity sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A== + dependencies: + iconv-lite "^0.6.2" + +end-of-stream@^1.4.1: + version "1.4.4" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" + integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== + dependencies: + once "^1.4.0" + +enquirer@^2.3.0: + version "2.4.1" + resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.4.1.tgz#93334b3fbd74fc7097b224ab4a8fb7e40bf4ae56" + integrity sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ== + dependencies: + ansi-colors "^4.1.1" + strip-ansi "^6.0.1" + +enquirer@~2.3.6: + version "2.3.6" + resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.3.6.tgz#2a7fe5dd634a1e4125a975ec994ff5456dc3734d" + integrity sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg== + dependencies: + ansi-colors "^4.1.1" + +env-paths@^2.2.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.1.tgz#420399d416ce1fbe9bc0a07c62fa68d67fd0f8f2" + integrity sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A== + +envinfo@7.8.1: + version "7.8.1" + resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.8.1.tgz#06377e3e5f4d379fea7ac592d5ad8927e0c4d475" + integrity sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw== + +err-code@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/err-code/-/err-code-2.0.3.tgz#23c2f3b756ffdfc608d30e27c9a941024807e7f9" + integrity sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA== + +error-ex@^1.3.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" + integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== + dependencies: + is-arrayish "^0.2.1" + +es-abstract@^1.22.1, es-abstract@^1.22.3: + version "1.22.3" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.22.3.tgz#48e79f5573198de6dee3589195727f4f74bc4f32" + integrity sha512-eiiY8HQeYfYH2Con2berK+To6GrK2RxbPawDkGq4UiCQQfZHb6wX9qQqkbpPqaxQFcl8d9QzZqo0tGE0VcrdwA== + dependencies: + array-buffer-byte-length "^1.0.0" + arraybuffer.prototype.slice "^1.0.2" + available-typed-arrays "^1.0.5" + call-bind "^1.0.5" + es-set-tostringtag "^2.0.1" + es-to-primitive "^1.2.1" + function.prototype.name "^1.1.6" + get-intrinsic "^1.2.2" + get-symbol-description "^1.0.0" + globalthis "^1.0.3" + gopd "^1.0.1" + has-property-descriptors "^1.0.0" + has-proto "^1.0.1" + has-symbols "^1.0.3" + hasown "^2.0.0" + internal-slot "^1.0.5" + is-array-buffer "^3.0.2" + is-callable "^1.2.7" + is-negative-zero "^2.0.2" + is-regex "^1.1.4" + is-shared-array-buffer "^1.0.2" + is-string "^1.0.7" + is-typed-array "^1.1.12" + is-weakref "^1.0.2" + object-inspect "^1.13.1" + object-keys "^1.1.1" + object.assign "^4.1.4" + regexp.prototype.flags "^1.5.1" + safe-array-concat "^1.0.1" + safe-regex-test "^1.0.0" + string.prototype.trim "^1.2.8" + string.prototype.trimend "^1.0.7" + string.prototype.trimstart "^1.0.7" + typed-array-buffer "^1.0.0" + typed-array-byte-length "^1.0.0" + typed-array-byte-offset "^1.0.0" + typed-array-length "^1.0.4" + unbox-primitive "^1.0.2" + which-typed-array "^1.1.13" + +es-array-method-boxes-properly@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz#873f3e84418de4ee19c5be752990b2e44718d09e" + integrity sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA== + +es-errors@^1.0.0, es-errors@^1.2.1, es-errors@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" + integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== + +es-set-tostringtag@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.0.2.tgz#11f7cc9f63376930a5f20be4915834f4bc74f9c9" + integrity sha512-BuDyupZt65P9D2D2vA/zqcI3G5xRsklm5N3xCwuiy+/vKy8i0ifdsQP1sLgO4tZDSCaQUSnmC48khknGMV3D2Q== + dependencies: + get-intrinsic "^1.2.2" + has-tostringtag "^1.0.0" + hasown "^2.0.0" + +es-shim-unscopables@^1.0.0, es-shim-unscopables@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz#1f6942e71ecc7835ed1c8a83006d8771a63a3763" + integrity sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw== + dependencies: + hasown "^2.0.0" + +es-to-primitive@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" + integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== + dependencies: + is-callable "^1.1.4" + is-date-object "^1.0.1" + is-symbol "^1.0.2" + +esbuild-plugin-tsc@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/esbuild-plugin-tsc/-/esbuild-plugin-tsc-0.4.0.tgz#d7d516fda0e0b05c8e0b442152deebdee01ddc61" + integrity sha512-q9gWIovt1nkwchMLc2zhyksaiHOv3kDK4b0AUol8lkMCRhJ1zavgfb2fad6BKp7FT9rh/OHmEBXVjczLoi/0yw== + dependencies: + strip-comments "^2.0.1" + +esbuild@^0.19.11: + version "0.19.12" + resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.19.12.tgz#dc82ee5dc79e82f5a5c3b4323a2a641827db3e04" + integrity sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg== + optionalDependencies: + "@esbuild/aix-ppc64" "0.19.12" + "@esbuild/android-arm" "0.19.12" + "@esbuild/android-arm64" "0.19.12" + "@esbuild/android-x64" "0.19.12" + "@esbuild/darwin-arm64" "0.19.12" + "@esbuild/darwin-x64" "0.19.12" + "@esbuild/freebsd-arm64" "0.19.12" + "@esbuild/freebsd-x64" "0.19.12" + "@esbuild/linux-arm" "0.19.12" + "@esbuild/linux-arm64" "0.19.12" + "@esbuild/linux-ia32" "0.19.12" + "@esbuild/linux-loong64" "0.19.12" + "@esbuild/linux-mips64el" "0.19.12" + "@esbuild/linux-ppc64" "0.19.12" + "@esbuild/linux-riscv64" "0.19.12" + "@esbuild/linux-s390x" "0.19.12" + "@esbuild/linux-x64" "0.19.12" + "@esbuild/netbsd-x64" "0.19.12" + "@esbuild/openbsd-x64" "0.19.12" + "@esbuild/sunos-x64" "0.19.12" + "@esbuild/win32-arm64" "0.19.12" + "@esbuild/win32-ia32" "0.19.12" + "@esbuild/win32-x64" "0.19.12" + +escalade@^3.1.1: + version "3.1.2" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.2.tgz#54076e9ab29ea5bf3d8f1ed62acffbb88272df27" + integrity sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA== + +escape-string-regexp@4.0.0, escape-string-regexp@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" + integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== + +escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== + +escape-string-regexp@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" + integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== + +eslint-config-airbnb-base@15.0.0, eslint-config-airbnb-base@^15.0.0: + version "15.0.0" + resolved "https://registry.yarnpkg.com/eslint-config-airbnb-base/-/eslint-config-airbnb-base-15.0.0.tgz#6b09add90ac79c2f8d723a2580e07f3925afd236" + integrity sha512-xaX3z4ZZIcFLvh2oUNvcX5oEofXda7giYmuplVxoOg5A7EXJMrUyqRgR+mhDhPK8LZ4PttFOBvCYDbX3sUoUig== + dependencies: + confusing-browser-globals "^1.0.10" + object.assign "^4.1.2" + object.entries "^1.1.5" + semver "^6.3.0" + +eslint-config-airbnb-typescript@17.1.0: + version "17.1.0" + resolved "https://registry.yarnpkg.com/eslint-config-airbnb-typescript/-/eslint-config-airbnb-typescript-17.1.0.tgz#fda960eee4a510f092a9a1c139035ac588937ddc" + integrity sha512-GPxI5URre6dDpJ0CtcthSZVBAfI+Uw7un5OYNVxP2EYi3H81Jw701yFP7AU+/vCE7xBtFmjge7kfhhk4+RAiig== + dependencies: + eslint-config-airbnb-base "^15.0.0" + +eslint-config-prettier@^9.0.0: + version "9.1.0" + resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz#31af3d94578645966c082fcb71a5846d3c94867f" + integrity sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw== + +eslint-import-resolver-node@^0.3.9: + version "0.3.9" + resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz#d4eaac52b8a2e7c3cd1903eb00f7e053356118ac" + integrity sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g== + dependencies: + debug "^3.2.7" + is-core-module "^2.13.0" + resolve "^1.22.4" + +eslint-module-utils@^2.8.0: + version "2.8.0" + resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz#e439fee65fc33f6bba630ff621efc38ec0375c49" + integrity sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw== + dependencies: + debug "^3.2.7" + +eslint-plugin-import@^2.28.1: + version "2.29.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz#d45b37b5ef5901d639c15270d74d46d161150643" + integrity sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw== + dependencies: + array-includes "^3.1.7" + array.prototype.findlastindex "^1.2.3" + array.prototype.flat "^1.3.2" + array.prototype.flatmap "^1.3.2" + debug "^3.2.7" + doctrine "^2.1.0" + eslint-import-resolver-node "^0.3.9" + eslint-module-utils "^2.8.0" + hasown "^2.0.0" + is-core-module "^2.13.1" + is-glob "^4.0.3" + minimatch "^3.1.2" + object.fromentries "^2.0.7" + object.groupby "^1.0.1" + object.values "^1.1.7" + semver "^6.3.1" + tsconfig-paths "^3.15.0" + +eslint-plugin-prettier@^5.0.0: + version "5.1.3" + resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-5.1.3.tgz#17cfade9e732cef32b5f5be53bd4e07afd8e67e1" + integrity sha512-C9GCVAs4Eq7ZC/XFQHITLiHJxQngdtraXaM+LoUFoFp/lHNl2Zn8f3WQbe9HvTBBQ9YnKFB0/2Ajdqwo5D1EAw== + dependencies: + prettier-linter-helpers "^1.0.0" + synckit "^0.8.6" + +eslint-plugin-security@^1.7.1: + version "1.7.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-security/-/eslint-plugin-security-1.7.1.tgz#0e9c4a471f6e4d3ca16413c7a4a51f3966ba16e4" + integrity sha512-sMStceig8AFglhhT2LqlU5r+/fn9OwsA72O5bBuQVTssPCdQAOQzL+oMn/ZcpeUY6KcNfLJArgcrsSULNjYYdQ== + dependencies: + safe-regex "^2.1.1" + +eslint-scope@^7.2.2: + version "7.2.2" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.2.2.tgz#deb4f92563390f32006894af62a22dba1c46423f" + integrity sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg== + dependencies: + esrecurse "^4.3.0" + estraverse "^5.2.0" + +eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4.3: + version "3.4.3" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800" + integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== + +eslint@^8.48.0: + version "8.56.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.56.0.tgz#4957ce8da409dc0809f99ab07a1b94832ab74b15" + integrity sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ== + dependencies: + "@eslint-community/eslint-utils" "^4.2.0" + "@eslint-community/regexpp" "^4.6.1" + "@eslint/eslintrc" "^2.1.4" + "@eslint/js" "8.56.0" + "@humanwhocodes/config-array" "^0.11.13" + "@humanwhocodes/module-importer" "^1.0.1" + "@nodelib/fs.walk" "^1.2.8" + "@ungap/structured-clone" "^1.2.0" + ajv "^6.12.4" + chalk "^4.0.0" + cross-spawn "^7.0.2" + debug "^4.3.2" + doctrine "^3.0.0" + escape-string-regexp "^4.0.0" + eslint-scope "^7.2.2" + eslint-visitor-keys "^3.4.3" + espree "^9.6.1" + esquery "^1.4.2" + esutils "^2.0.2" + fast-deep-equal "^3.1.3" + file-entry-cache "^6.0.1" + find-up "^5.0.0" + glob-parent "^6.0.2" + globals "^13.19.0" + graphemer "^1.4.0" + ignore "^5.2.0" + imurmurhash "^0.1.4" + is-glob "^4.0.0" + is-path-inside "^3.0.3" + js-yaml "^4.1.0" + json-stable-stringify-without-jsonify "^1.0.1" + levn "^0.4.1" + lodash.merge "^4.6.2" + minimatch "^3.1.2" + natural-compare "^1.4.0" + optionator "^0.9.3" + strip-ansi "^6.0.1" + text-table "^0.2.0" + +espree@^9.6.0, espree@^9.6.1: + version "9.6.1" + resolved "https://registry.yarnpkg.com/espree/-/espree-9.6.1.tgz#a2a17b8e434690a5432f2f8018ce71d331a48c6f" + integrity sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ== + dependencies: + acorn "^8.9.0" + acorn-jsx "^5.3.2" + eslint-visitor-keys "^3.4.1" + +esprima@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" + integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== + +esquery@^1.4.2: + version "1.5.0" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.5.0.tgz#6ce17738de8577694edd7361c57182ac8cb0db0b" + integrity sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg== + dependencies: + estraverse "^5.1.0" + +esrecurse@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" + integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== + dependencies: + estraverse "^5.2.0" + +estraverse@^5.1.0, estraverse@^5.2.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" + integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== + +esutils@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" + integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== + +ethereum-bloom-filters@^1.0.6: + version "1.0.10" + resolved "https://registry.yarnpkg.com/ethereum-bloom-filters/-/ethereum-bloom-filters-1.0.10.tgz#3ca07f4aed698e75bd134584850260246a5fed8a" + integrity sha512-rxJ5OFN3RwjQxDcFP2Z5+Q9ho4eIdEmSc2ht0fCu8Se9nbXjZ7/031uXoUYJ87KHCOdVeiUuwSnoS7hmYAGVHA== + dependencies: + js-sha3 "^0.8.0" + +ethereum-cryptography@0.1.3, ethereum-cryptography@^0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz#8d6143cfc3d74bf79bbd8edecdf29e4ae20dd191" + integrity sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ== + dependencies: + "@types/pbkdf2" "^3.0.0" + "@types/secp256k1" "^4.0.1" + blakejs "^1.1.0" + browserify-aes "^1.2.0" + bs58check "^2.1.2" + create-hash "^1.2.0" + create-hmac "^1.1.7" + hash.js "^1.1.7" + keccak "^3.0.0" + pbkdf2 "^3.0.17" + randombytes "^2.1.0" + safe-buffer "^5.1.2" + scrypt-js "^3.0.0" + secp256k1 "^4.0.1" + setimmediate "^1.0.5" + +ethereum-cryptography@^1.0.3: + version "1.2.0" + resolved "https://registry.yarnpkg.com/ethereum-cryptography/-/ethereum-cryptography-1.2.0.tgz#5ccfa183e85fdaf9f9b299a79430c044268c9b3a" + integrity sha512-6yFQC9b5ug6/17CQpCyE3k9eKBMdhyVjzUy1WkiuY/E4vj/SXDBbCw8QEIaXqf0Mf2SnY6RmpDcwlUmBSS0EJw== + dependencies: + "@noble/hashes" "1.2.0" + "@noble/secp256k1" "1.7.1" + "@scure/bip32" "1.1.5" + "@scure/bip39" "1.1.1" + +ethereum-cryptography@^2.0.0, ethereum-cryptography@^2.1.2: + version "2.1.3" + resolved "https://registry.yarnpkg.com/ethereum-cryptography/-/ethereum-cryptography-2.1.3.tgz#1352270ed3b339fe25af5ceeadcf1b9c8e30768a" + integrity sha512-BlwbIL7/P45W8FGW2r7LGuvoEZ+7PWsniMvQ4p5s2xCyw9tmaDlpfsN9HjAucbF+t/qpVHwZUisgfK24TCW8aA== + dependencies: + "@noble/curves" "1.3.0" + "@noble/hashes" "1.3.3" + "@scure/bip32" "1.3.3" + "@scure/bip39" "1.2.2" + +ethereumjs-abi@^0.6.8: + version "0.6.8" + resolved "https://registry.yarnpkg.com/ethereumjs-abi/-/ethereumjs-abi-0.6.8.tgz#71bc152db099f70e62f108b7cdfca1b362c6fcae" + integrity sha512-Tx0r/iXI6r+lRsdvkFDlut0N08jWMnKRZ6Gkq+Nmw75lZe4e6o3EkSnkaBP5NF6+m5PTGAr9JP43N3LyeoglsA== + dependencies: + bn.js "^4.11.8" + ethereumjs-util "^6.0.0" + +ethereumjs-util@^6.0.0, ethereumjs-util@^6.2.1: + version "6.2.1" + resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-6.2.1.tgz#fcb4e4dd5ceacb9d2305426ab1a5cd93e3163b69" + integrity sha512-W2Ktez4L01Vexijrm5EB6w7dg4n/TgpoYU4avuT5T3Vmnw/eCRtiBrJfQYS/DCSvDIOLn2k57GcHdeBcgVxAqw== + dependencies: + "@types/bn.js" "^4.11.3" + bn.js "^4.11.0" + create-hash "^1.1.2" + elliptic "^6.5.2" + ethereum-cryptography "^0.1.3" + ethjs-util "0.1.6" + rlp "^2.2.3" + +ethers@^5.7.1: + version "5.7.2" + resolved "https://registry.yarnpkg.com/ethers/-/ethers-5.7.2.tgz#3a7deeabbb8c030d4126b24f84e525466145872e" + integrity sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg== + dependencies: + "@ethersproject/abi" "5.7.0" + "@ethersproject/abstract-provider" "5.7.0" + "@ethersproject/abstract-signer" "5.7.0" + "@ethersproject/address" "5.7.0" + "@ethersproject/base64" "5.7.0" + "@ethersproject/basex" "5.7.0" + "@ethersproject/bignumber" "5.7.0" + "@ethersproject/bytes" "5.7.0" + "@ethersproject/constants" "5.7.0" + "@ethersproject/contracts" "5.7.0" + "@ethersproject/hash" "5.7.0" + "@ethersproject/hdnode" "5.7.0" + "@ethersproject/json-wallets" "5.7.0" + "@ethersproject/keccak256" "5.7.0" + "@ethersproject/logger" "5.7.0" + "@ethersproject/networks" "5.7.1" + "@ethersproject/pbkdf2" "5.7.0" + "@ethersproject/properties" "5.7.0" + "@ethersproject/providers" "5.7.2" + "@ethersproject/random" "5.7.0" + "@ethersproject/rlp" "5.7.0" + "@ethersproject/sha2" "5.7.0" + "@ethersproject/signing-key" "5.7.0" + "@ethersproject/solidity" "5.7.0" + "@ethersproject/strings" "5.7.0" + "@ethersproject/transactions" "5.7.0" + "@ethersproject/units" "5.7.0" + "@ethersproject/wallet" "5.7.0" + "@ethersproject/web" "5.7.1" + "@ethersproject/wordlists" "5.7.0" + +ethjs-unit@0.1.6: + version "0.1.6" + resolved "https://registry.yarnpkg.com/ethjs-unit/-/ethjs-unit-0.1.6.tgz#c665921e476e87bce2a9d588a6fe0405b2c41699" + integrity sha512-/Sn9Y0oKl0uqQuvgFk/zQgR7aw1g36qX/jzSQ5lSwlO0GigPymk4eGQfeNTD03w1dPOqfz8V77Cy43jH56pagw== + dependencies: + bn.js "4.11.6" + number-to-bn "1.7.0" + +ethjs-util@0.1.6, ethjs-util@^0.1.6: + version "0.1.6" + resolved "https://registry.yarnpkg.com/ethjs-util/-/ethjs-util-0.1.6.tgz#f308b62f185f9fe6237132fb2a9818866a5cd536" + integrity sha512-CUnVOQq7gSpDHZVVrQW8ExxUETWrnrvXYvYz55wOU8Uj4VCgw56XC2B/fVqQN+f7gmrnRHSLVnFAwsCuNwji8w== + dependencies: + is-hex-prefixed "1.0.0" + strip-hex-prefix "1.0.0" + +ev-emitter@^2.0.0: + version "2.1.2" + resolved "https://registry.yarnpkg.com/ev-emitter/-/ev-emitter-2.1.2.tgz#91737a2deae9fa95453e7e86cfae976f8c3ced38" + integrity sha512-jQ5Ql18hdCQ4qS+RCrbLfz1n+Pags27q5TwMKvZyhp5hh2UULUYZUy1keqj6k6SYsdqIYjnmz7xyyEY0V67B8Q== + +eventemitter3@^4.0.4: + version "4.0.7" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" + integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== + +eventemitter3@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-5.0.1.tgz#53f5ffd0a492ac800721bb42c66b841de96423c4" + integrity sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA== + +events@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" + integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== + +evp_bytestokey@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02" + integrity sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA== + dependencies: + md5.js "^1.3.4" + safe-buffer "^5.1.1" + +execa@5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-5.0.0.tgz#4029b0007998a841fbd1032e5f4de86a3c1e3376" + integrity sha512-ov6w/2LCiuyO4RLYGdpFGjkcs0wMTgGE8PrkTHikeUy5iJekXyPIKUjifk5CsE0pt7sMCrMZ3YNqoCj6idQOnQ== + dependencies: + cross-spawn "^7.0.3" + get-stream "^6.0.0" + human-signals "^2.1.0" + is-stream "^2.0.0" + merge-stream "^2.0.0" + npm-run-path "^4.0.1" + onetime "^5.1.2" + signal-exit "^3.0.3" + strip-final-newline "^2.0.0" + +execa@^5.0.0: + version "5.1.1" + resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" + integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== + dependencies: + cross-spawn "^7.0.3" + get-stream "^6.0.0" + human-signals "^2.1.0" + is-stream "^2.0.0" + merge-stream "^2.0.0" + npm-run-path "^4.0.1" + onetime "^5.1.2" + signal-exit "^3.0.3" + strip-final-newline "^2.0.0" + +exit@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" + integrity sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ== + +expand-tilde@^2.0.0, expand-tilde@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/expand-tilde/-/expand-tilde-2.0.2.tgz#97e801aa052df02454de46b02bf621642cdc8502" + integrity sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw== + dependencies: + homedir-polyfill "^1.0.1" + +expect@^29.0.0, expect@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/expect/-/expect-29.7.0.tgz#578874590dcb3214514084c08115d8aee61e11bc" + integrity sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw== + dependencies: + "@jest/expect-utils" "^29.7.0" + jest-get-type "^29.6.3" + jest-matcher-utils "^29.7.0" + jest-message-util "^29.7.0" + jest-util "^29.7.0" + +exponential-backoff@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/exponential-backoff/-/exponential-backoff-3.1.1.tgz#64ac7526fe341ab18a39016cd22c787d01e00bf6" + integrity sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw== + +external-editor@^3.0.3: + version "3.1.0" + resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495" + integrity sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew== + dependencies: + chardet "^0.7.0" + iconv-lite "^0.4.24" + tmp "^0.0.33" + +fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" + integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== + +fast-diff@^1.1.2: + version "1.3.0" + resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.3.0.tgz#ece407fa550a64d638536cd727e129c61616e0f0" + integrity sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw== + +fast-glob@^3.2.9: + version "3.3.2" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.2.tgz#a904501e57cfdd2ffcded45e99a54fef55e46129" + integrity sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.2" + merge2 "^1.3.0" + micromatch "^4.0.4" + +fast-json-stable-stringify@2.x, fast-json-stable-stringify@^2.0.0, fast-json-stable-stringify@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== + +fast-levenshtein@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== + +fastq@^1.6.0: + version "1.17.1" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.17.1.tgz#2a523f07a4e7b1e81a42b91b8bf2254107753b47" + integrity sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w== + dependencies: + reusify "^1.0.4" + +fb-watchman@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.2.tgz#e9524ee6b5c77e9e5001af0f85f3adbb8623255c" + integrity sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA== + dependencies: + bser "2.1.1" + +fecha@^4.2.0: + version "4.2.3" + resolved "https://registry.yarnpkg.com/fecha/-/fecha-4.2.3.tgz#4d9ccdbc61e8629b259fdca67e65891448d569fd" + integrity sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw== + +figures@3.2.0, figures@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/figures/-/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af" + integrity sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg== + dependencies: + escape-string-regexp "^1.0.5" + +file-entry-cache@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" + integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== + dependencies: + flat-cache "^3.0.4" + +filelist@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/filelist/-/filelist-1.0.4.tgz#f78978a1e944775ff9e62e744424f215e58352b5" + integrity sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q== + dependencies: + minimatch "^5.0.1" + +filename-reserved-regex@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/filename-reserved-regex/-/filename-reserved-regex-2.0.0.tgz#abf73dfab735d045440abfea2d91f389ebbfa229" + integrity sha512-lc1bnsSr4L4Bdif8Xb/qrtokGbq5zlsms/CYH8PP+WtCkGNF65DPiQY8vG3SakEdRn8Dlnm+gW/qWKKjS5sZzQ== + +filenamify@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/filenamify/-/filenamify-4.3.0.tgz#62391cb58f02b09971c9d4f9d63b3cf9aba03106" + integrity sha512-hcFKyUG57yWGAzu1CMt/dPzYZuv+jAJUT85bL8mrXvNe6hWj6yEHEc4EdcgiA6Z3oi1/9wXJdZPXF2dZNgwgOg== + dependencies: + filename-reserved-regex "^2.0.0" + strip-outer "^1.0.1" + trim-repeated "^1.0.0" + +fill-range@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" + integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== + dependencies: + to-regex-range "^5.0.1" + +filter-obj@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/filter-obj/-/filter-obj-5.1.0.tgz#5bd89676000a713d7db2e197f660274428e524ed" + integrity sha512-qWeTREPoT7I0bifpPUXtxkZJ1XJzxWtfoWWkdVGqa+eCr3SHW/Ocp89o8vLvbUuQnadybJpjOKu4V+RwO6sGng== + +find-cache-dir@^3.3.1: + version "3.3.2" + resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-3.3.2.tgz#b30c5b6eff0730731aea9bbd9dbecbd80256d64b" + integrity sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig== + dependencies: + commondir "^1.0.1" + make-dir "^3.0.2" + pkg-dir "^4.1.0" + +find-node-modules@2.1.3: + version "2.1.3" + resolved "https://registry.yarnpkg.com/find-node-modules/-/find-node-modules-2.1.3.tgz#3c976cff2ca29ee94b4f9eafc613987fc4c0ee44" + integrity sha512-UC2I2+nx1ZuOBclWVNdcnbDR5dlrOdVb7xNjmT/lHE+LsgztWks3dG7boJ37yTS/venXw84B/mAW9uHVoC5QRg== + dependencies: + findup-sync "^4.0.0" + merge "^2.1.1" + +find-up@5.0.0, find-up@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" + integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== + dependencies: + locate-path "^6.0.0" + path-exists "^4.0.0" + +find-up@^2.0.0, find-up@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" + integrity sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ== + dependencies: + locate-path "^2.0.0" + +find-up@^4.0.0, find-up@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" + integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== + dependencies: + locate-path "^5.0.0" + path-exists "^4.0.0" + +findup-sync@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-4.0.0.tgz#956c9cdde804052b881b428512905c4a5f2cdef0" + integrity sha512-6jvvn/12IC4quLBL1KNokxC7wWTvYncaVUYSoxWw7YykPLuRrnv4qdHcSOywOI5RpkOVGeQRtWM8/q+G6W6qfQ== + dependencies: + detect-file "^1.0.0" + is-glob "^4.0.0" + micromatch "^4.0.2" + resolve-dir "^1.0.1" + +flat-cache@^3.0.4: + version "3.2.0" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.2.0.tgz#2c0c2d5040c99b1632771a9d105725c0115363ee" + integrity sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw== + dependencies: + flatted "^3.2.9" + keyv "^4.5.3" + rimraf "^3.0.2" + +flat@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" + integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== + +flatted@^3.2.9: + version "3.2.9" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.9.tgz#7eb4c67ca1ba34232ca9d2d93e9886e611ad7daf" + integrity sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ== + +fn.name@1.x.x: + version "1.1.0" + resolved "https://registry.yarnpkg.com/fn.name/-/fn.name-1.1.0.tgz#26cad8017967aea8731bc42961d04a3d5988accc" + integrity sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw== + +follow-redirects@^1.12.1, follow-redirects@^1.15.4: + version "1.15.5" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.5.tgz#54d4d6d062c0fa7d9d17feb008461550e3ba8020" + integrity sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw== + +for-each@^0.3.3: + version "0.3.3" + resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" + integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== + dependencies: + is-callable "^1.1.3" + +foreground-child@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-3.1.1.tgz#1d173e776d75d2772fed08efe4a0de1ea1b12d0d" + integrity sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg== + dependencies: + cross-spawn "^7.0.0" + signal-exit "^4.0.1" + +form-data@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452" + integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.8" + mime-types "^2.1.12" + +fp-ts@1.19.3: + version "1.19.3" + resolved "https://registry.yarnpkg.com/fp-ts/-/fp-ts-1.19.3.tgz#261a60d1088fbff01f91256f91d21d0caaaaa96f" + integrity sha512-H5KQDspykdHuztLTg+ajGN0Z2qUjcEf3Ybxc6hLt0k7/zPkn29XnKnxlBPyW2XIddWrGaJBzBl4VLYOtk39yZg== + +fp-ts@^1.0.0: + version "1.19.5" + resolved "https://registry.yarnpkg.com/fp-ts/-/fp-ts-1.19.5.tgz#3da865e585dfa1fdfd51785417357ac50afc520a" + integrity sha512-wDNqTimnzs8QqpldiId9OavWK2NptormjXnRJTQecNjzwfyp6P/8s/zG8e4h3ja3oqkKaY72UlTjQYt/1yXf9A== + +fs-constants@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad" + integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow== + +fs-extra@^0.30.0: + version "0.30.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-0.30.0.tgz#f233ffcc08d4da7d432daa449776989db1df93f0" + integrity sha512-UvSPKyhMn6LEd/WpUaV9C9t3zATuqoqfWc3QdPhPLb58prN9tqYPlPWi8Krxi44loBoUzlobqZ3+8tGpxxSzwA== + dependencies: + graceful-fs "^4.1.2" + jsonfile "^2.1.0" + klaw "^1.0.0" + path-is-absolute "^1.0.0" + rimraf "^2.2.8" + +fs-extra@^11.1.0, fs-extra@^11.1.1: + version "11.2.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-11.2.0.tgz#e70e17dfad64232287d01929399e0ea7c86b0e5b" + integrity sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + +fs-extra@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-7.0.1.tgz#4f189c44aa123b895f722804f55ea23eadc348e9" + integrity sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw== + dependencies: + graceful-fs "^4.1.2" + jsonfile "^4.0.0" + universalify "^0.1.0" + +fs-minipass@^2.0.0, fs-minipass@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-2.1.0.tgz#7f5036fdbf12c63c169190cbe4199c852271f9fb" + integrity sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg== + dependencies: + minipass "^3.0.0" + +fs-minipass@^3.0.0: + version "3.0.3" + resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-3.0.3.tgz#79a85981c4dc120065e96f62086bf6f9dc26cc54" + integrity sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw== + dependencies: + minipass "^7.0.3" + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== + +fsevents@^2.3.2, fsevents@~2.3.2: + version "2.3.3" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" + integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== + +function-bind@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" + integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== + +function.prototype.name@^1.1.6: + version "1.1.6" + resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.6.tgz#cdf315b7d90ee77a4c6ee216c3c3362da07533fd" + integrity sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + functions-have-names "^1.2.3" + +functional-red-black-tree@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" + integrity sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g== + +functions-have-names@^1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" + integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== + +ganache@^7.9.2: + version "7.9.2" + resolved "https://registry.yarnpkg.com/ganache/-/ganache-7.9.2.tgz#77f506ad2735dd9109696ffa1834a9dd2f806449" + integrity sha512-7gsVVDpO9AhrFyDMWWl7SpMsPpqGcnAzjxz3k32LheIPNd64p2XsY9GYRdhWmKuryb60W1iaWPZWDkFKlbRWHA== + dependencies: + "@trufflesuite/bigint-buffer" "1.1.10" + "@trufflesuite/uws-js-unofficial" "20.30.0-unofficial.0" + "@types/bn.js" "^5.1.0" + "@types/lru-cache" "5.1.1" + "@types/seedrandom" "3.0.1" + abstract-level "1.0.3" + abstract-leveldown "7.2.0" + async-eventemitter "0.2.4" + emittery "0.10.0" + keccak "3.0.2" + leveldown "6.1.0" + secp256k1 "4.0.3" + optionalDependencies: + bufferutil "4.0.5" + utf-8-validate "5.0.7" + +gauge@^4.0.3: + version "4.0.4" + resolved "https://registry.yarnpkg.com/gauge/-/gauge-4.0.4.tgz#52ff0652f2bbf607a989793d53b751bef2328dce" + integrity sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg== + dependencies: + aproba "^1.0.3 || ^2.0.0" + color-support "^1.1.3" + console-control-strings "^1.1.0" + has-unicode "^2.0.1" + signal-exit "^3.0.7" + string-width "^4.2.3" + strip-ansi "^6.0.1" + wide-align "^1.1.5" + +gensync@^1.0.0-beta.2: + version "1.0.0-beta.2" + resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" + integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== + +get-caller-file@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" + integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== + +get-intrinsic@^1.1.3, get-intrinsic@^1.2.1, get-intrinsic@^1.2.2, get-intrinsic@^1.2.3, get-intrinsic@^1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.4.tgz#e385f5a4b5227d449c3eabbad05494ef0abbeadd" + integrity sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ== + dependencies: + es-errors "^1.3.0" + function-bind "^1.1.2" + has-proto "^1.0.1" + has-symbols "^1.0.3" + hasown "^2.0.0" + +get-package-type@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a" + integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== + +get-pkg-repo@^4.2.1: + version "4.2.1" + resolved "https://registry.yarnpkg.com/get-pkg-repo/-/get-pkg-repo-4.2.1.tgz#75973e1c8050c73f48190c52047c4cee3acbf385" + integrity sha512-2+QbHjFRfGB74v/pYWjd5OhU3TDIC2Gv/YKUTk/tCvAz0pkn/Mz6P3uByuBimLOcPvN2jYdScl3xGFSrx0jEcA== + dependencies: + "@hutson/parse-repository-url" "^3.0.0" + hosted-git-info "^4.0.0" + through2 "^2.0.0" + yargs "^16.2.0" + +get-port@5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/get-port/-/get-port-5.1.1.tgz#0469ed07563479de6efb986baf053dcd7d4e3193" + integrity sha512-g/Q1aTSDOxFpchXC4i8ZWvxA1lnPqx/JHqcpIw0/LX9T8x/GBbi6YnlN5nhaKIFkT8oFsscUKgDJYxfwfS6QsQ== + +get-size@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/get-size/-/get-size-3.0.0.tgz#00e39a8042a3de237b2fcf288eaf55d3f472417c" + integrity sha512-Y8aiXLq4leR7807UY0yuKEwif5s3kbVp1nTv+i4jBeoUzByTLKkLWu/HorS6/pB+7gsB0o7OTogC8AoOOeT0Hw== + +get-stream@6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.0.tgz#3e0012cb6827319da2706e601a1583e8629a6718" + integrity sha512-A1B3Bh1UmL0bidM/YX2NsCOTnGJePL9rO/M+Mw3m9f2gUpfokS0hi5Eah0WSUEWZdZhIZtMjkIYS7mDfOqNHbg== + +get-stream@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" + integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== + +get-symbol-description@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.2.tgz#533744d5aa20aca4e079c8e5daf7fd44202821f5" + integrity sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg== + dependencies: + call-bind "^1.0.5" + es-errors "^1.3.0" + get-intrinsic "^1.2.4" + +gh-pages@^6.1.1: + version "6.1.1" + resolved "https://registry.yarnpkg.com/gh-pages/-/gh-pages-6.1.1.tgz#e80af927a081cb480657fde5a0b87ea2e77d6c74" + integrity sha512-upnohfjBwN5hBP9w2dPE7HO5JJTHzSGMV1JrLrHvNuqmjoYHg6TBrCcnEoorjG/e0ejbuvnwyKMdTyM40PEByw== + dependencies: + async "^3.2.4" + commander "^11.0.0" + email-addresses "^5.0.0" + filenamify "^4.3.0" + find-cache-dir "^3.3.1" + fs-extra "^11.1.1" + globby "^6.1.0" + +git-raw-commits@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/git-raw-commits/-/git-raw-commits-3.0.0.tgz#5432f053a9744f67e8db03dbc48add81252cfdeb" + integrity sha512-b5OHmZ3vAgGrDn/X0kS+9qCfNKWe4K/jFnhwzVWWg0/k5eLa3060tZShrRg8Dja5kPc+YjS0Gc6y7cRr44Lpjw== + dependencies: + dargs "^7.0.0" + meow "^8.1.2" + split2 "^3.2.2" + +git-remote-origin-url@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/git-remote-origin-url/-/git-remote-origin-url-2.0.0.tgz#5282659dae2107145a11126112ad3216ec5fa65f" + integrity sha512-eU+GGrZgccNJcsDH5LkXR3PB9M958hxc7sbA8DFJjrv9j4L2P/eZfKhM+QD6wyzpiv+b1BpK0XrYCxkovtjSLw== + dependencies: + gitconfiglocal "^1.0.0" + pify "^2.3.0" + +git-semver-tags@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/git-semver-tags/-/git-semver-tags-5.0.1.tgz#db748aa0e43d313bf38dcd68624d8443234e1c15" + integrity sha512-hIvOeZwRbQ+7YEUmCkHqo8FOLQZCEn18yevLHADlFPZY02KJGsu5FZt9YW/lybfK2uhWFI7Qg/07LekJiTv7iA== + dependencies: + meow "^8.1.2" + semver "^7.0.0" + +git-up@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/git-up/-/git-up-7.0.0.tgz#bace30786e36f56ea341b6f69adfd83286337467" + integrity sha512-ONdIrbBCFusq1Oy0sC71F5azx8bVkvtZtMJAsv+a6lz5YAmbNnLD6HAB4gptHZVLPR8S2/kVN6Gab7lryq5+lQ== + dependencies: + is-ssh "^1.4.0" + parse-url "^8.1.0" + +git-url-parse@13.1.0: + version "13.1.0" + resolved "https://registry.yarnpkg.com/git-url-parse/-/git-url-parse-13.1.0.tgz#07e136b5baa08d59fabdf0e33170de425adf07b4" + integrity sha512-5FvPJP/70WkIprlUZ33bm4UAaFdjcLkJLpWft1BeZKqwR0uhhNGoKwlUaPtVb4LxCSQ++erHapRak9kWGj+FCA== + dependencies: + git-up "^7.0.0" + +gitconfiglocal@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/gitconfiglocal/-/gitconfiglocal-1.0.0.tgz#41d045f3851a5ea88f03f24ca1c6178114464b9b" + integrity sha512-spLUXeTAVHxDtKsJc8FkFVgFtMdEN9qPGpL23VfSHx4fP4+Ds097IXLvymbnDH8FnmxX5Nr9bPw3A+AQ6mWEaQ== + dependencies: + ini "^1.3.2" + +glob-parent@5.1.2, glob-parent@^5.1.2, glob-parent@~5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + +glob-parent@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" + integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== + dependencies: + is-glob "^4.0.3" + +glob@7.1.4: + version "7.1.4" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.4.tgz#aa608a2f6c577ad357e1ae5a5c26d9a8d1969255" + integrity sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + +glob@7.2.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023" + integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + +glob@8.1.0, glob@^8.0.1: + version "8.1.0" + resolved "https://registry.yarnpkg.com/glob/-/glob-8.1.0.tgz#d388f656593ef708ee3e34640fdfb99a9fd1c33e" + integrity sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^5.0.1" + once "^1.3.0" + +glob@^10.2.2, glob@^10.3.7: + version "10.3.10" + resolved "https://registry.yarnpkg.com/glob/-/glob-10.3.10.tgz#0351ebb809fd187fe421ab96af83d3a70715df4b" + integrity sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g== + dependencies: + foreground-child "^3.1.0" + jackspeak "^2.3.5" + minimatch "^9.0.1" + minipass "^5.0.0 || ^6.0.2 || ^7.0.0" + path-scurry "^1.10.1" + +glob@^7.0.3, glob@^7.1.3, glob@^7.1.4: + version "7.2.3" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" + integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.1.1" + once "^1.3.0" + path-is-absolute "^1.0.0" + +glob@^9.2.0: + version "9.3.5" + resolved "https://registry.yarnpkg.com/glob/-/glob-9.3.5.tgz#ca2ed8ca452781a3009685607fdf025a899dfe21" + integrity sha512-e1LleDykUz2Iu+MTYdkSsuWX8lvAjAcs0Xef0lNIu0S2wOAzuTxCJtcd9S3cijlwYF18EsU3rzb8jPVobxDh9Q== + dependencies: + fs.realpath "^1.0.0" + minimatch "^8.0.2" + minipass "^4.2.4" + path-scurry "^1.6.1" + +global-modules@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-1.0.0.tgz#6d770f0eb523ac78164d72b5e71a8877265cc3ea" + integrity sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg== + dependencies: + global-prefix "^1.0.1" + is-windows "^1.0.1" + resolve-dir "^1.0.0" + +global-prefix@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-1.0.2.tgz#dbf743c6c14992593c655568cb66ed32c0122ebe" + integrity sha512-5lsx1NUDHtSjfg0eHlmYvZKv8/nVqX4ckFbM+FrGcQ+04KWcWFo9P5MxPZYSzUvyzmdTbI7Eix8Q4IbELDqzKg== + dependencies: + expand-tilde "^2.0.2" + homedir-polyfill "^1.0.1" + ini "^1.3.4" + is-windows "^1.0.1" + which "^1.2.14" + +globals@^11.1.0: + version "11.12.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" + integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== + +globals@^13.19.0: + version "13.24.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-13.24.0.tgz#8432a19d78ce0c1e833949c36adb345400bb1171" + integrity sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ== + dependencies: + type-fest "^0.20.2" + +globalthis@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.3.tgz#5852882a52b80dc301b0660273e1ed082f0b6ccf" + integrity sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA== + dependencies: + define-properties "^1.1.3" + +globby@11.1.0, globby@^11.1.0: + version "11.1.0" + resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" + integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== + dependencies: + array-union "^2.1.0" + dir-glob "^3.0.1" + fast-glob "^3.2.9" + ignore "^5.2.0" + merge2 "^1.4.1" + slash "^3.0.0" + +globby@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/globby/-/globby-6.1.0.tgz#f5a6d70e8395e21c858fb0489d64df02424d506c" + integrity sha512-KVbFv2TQtbzCoxAnfD6JcHZTYCzyliEaaeM/gH8qQdkKr5s0OP9scEgvdcngyk7AVdY6YVW/TJHd+lQ/Df3Daw== + dependencies: + array-union "^1.0.1" + glob "^7.0.3" + object-assign "^4.0.1" + pify "^2.0.0" + pinkie-promise "^2.0.0" + +gopd@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" + integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== + dependencies: + get-intrinsic "^1.1.3" + +graceful-fs@4.2.11, graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.1.9, graceful-fs@^4.2.0, graceful-fs@^4.2.6, graceful-fs@^4.2.9: + version "4.2.11" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" + integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== + +graphemer@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6" + integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== + +handlebars@^4.7.7: + version "4.7.8" + resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.7.8.tgz#41c42c18b1be2365439188c77c6afae71c0cd9e9" + integrity sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ== + dependencies: + minimist "^1.2.5" + neo-async "^2.6.2" + source-map "^0.6.1" + wordwrap "^1.0.0" + optionalDependencies: + uglify-js "^3.1.4" + +hard-rejection@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/hard-rejection/-/hard-rejection-2.1.0.tgz#1c6eda5c1685c63942766d79bb40ae773cecd883" + integrity sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA== + +hardhat@^2.17.3: + version "2.19.5" + resolved "https://registry.yarnpkg.com/hardhat/-/hardhat-2.19.5.tgz#6017c35ae2844b669e9bcc84c3d05346d4ef031c" + integrity sha512-vx8R7zWCYVgM56vA6o0Wqx2bIIptkN4TMs9QwDqZVNGRhMzBfzqUeEYbp+69gxWp1neg2V2nYQUaaUv7aom1kw== + dependencies: + "@ethersproject/abi" "^5.1.2" + "@metamask/eth-sig-util" "^4.0.0" + "@nomicfoundation/ethereumjs-block" "5.0.2" + "@nomicfoundation/ethereumjs-blockchain" "7.0.2" + "@nomicfoundation/ethereumjs-common" "4.0.2" + "@nomicfoundation/ethereumjs-evm" "2.0.2" + "@nomicfoundation/ethereumjs-rlp" "5.0.2" + "@nomicfoundation/ethereumjs-statemanager" "2.0.2" + "@nomicfoundation/ethereumjs-trie" "6.0.2" + "@nomicfoundation/ethereumjs-tx" "5.0.2" + "@nomicfoundation/ethereumjs-util" "9.0.2" + "@nomicfoundation/ethereumjs-vm" "7.0.2" + "@nomicfoundation/solidity-analyzer" "^0.1.0" + "@sentry/node" "^5.18.1" + "@types/bn.js" "^5.1.0" + "@types/lru-cache" "^5.1.0" + adm-zip "^0.4.16" + aggregate-error "^3.0.0" + ansi-escapes "^4.3.0" + boxen "^5.1.2" + chalk "^2.4.2" + chokidar "^3.4.0" + ci-info "^2.0.0" + debug "^4.1.1" + enquirer "^2.3.0" + env-paths "^2.2.0" + ethereum-cryptography "^1.0.3" + ethereumjs-abi "^0.6.8" + find-up "^2.1.0" + fp-ts "1.19.3" + fs-extra "^7.0.1" + glob "7.2.0" + immutable "^4.0.0-rc.12" + io-ts "1.10.4" + keccak "^3.0.2" + lodash "^4.17.11" + mnemonist "^0.38.0" + mocha "^10.0.0" + p-map "^4.0.0" + raw-body "^2.4.1" + resolve "1.17.0" + semver "^6.3.0" + solc "0.7.3" + source-map-support "^0.5.13" + stacktrace-parser "^0.1.10" + tsort "0.0.1" + undici "^5.14.0" + uuid "^8.3.2" + ws "^7.4.6" + +has-bigints@^1.0.1, has-bigints@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.2.tgz#0871bd3e3d51626f6ca0966668ba35d5602d6eaa" + integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ== + +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== + +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + +has-property-descriptors@^1.0.0, has-property-descriptors@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz#52ba30b6c5ec87fd89fa574bc1c39125c6f65340" + integrity sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg== + dependencies: + get-intrinsic "^1.2.2" + +has-proto@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.1.tgz#1885c1305538958aff469fef37937c22795408e0" + integrity sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg== + +has-symbols@^1.0.2, has-symbols@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" + integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== + +has-tostringtag@^1.0.0, has-tostringtag@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.2.tgz#2cdc42d40bef2e5b4eeab7c01a73c54ce7ab5abc" + integrity sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw== + dependencies: + has-symbols "^1.0.3" + +has-unicode@2.0.1, has-unicode@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" + integrity sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ== + +hash-base@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.1.0.tgz#55c381d9e06e1d2997a883b4a3fddfe7f0d3af33" + integrity sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA== + dependencies: + inherits "^2.0.4" + readable-stream "^3.6.0" + safe-buffer "^5.2.0" + +hash.js@1.1.7, hash.js@^1.0.0, hash.js@^1.0.3, hash.js@^1.1.7: + version "1.1.7" + resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" + integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== + dependencies: + inherits "^2.0.3" + minimalistic-assert "^1.0.1" + +hasown@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.1.tgz#26f48f039de2c0f8d3356c223fb8d50253519faa" + integrity sha512-1/th4MHjnwncwXsIW6QMzlvYL9kG5e/CpVvLRZe4XPa8TOUNbCELqmvhDmnkNsAjwaG4+I8gJJL0JBvTTLO9qA== + dependencies: + function-bind "^1.1.2" + +he@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" + integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== + +highlight.js@^10.7.1: + version "10.7.3" + resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-10.7.3.tgz#697272e3991356e40c3cac566a74eef681756531" + integrity sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A== + +hmac-drbg@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" + integrity sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg== + dependencies: + hash.js "^1.0.3" + minimalistic-assert "^1.0.0" + minimalistic-crypto-utils "^1.0.1" + +homedir-polyfill@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz#743298cef4e5af3e194161fbadcc2151d3a058e8" + integrity sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA== + dependencies: + parse-passwd "^1.0.0" + +hosted-git-info@^2.1.4: + version "2.8.9" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz#dffc0bf9a21c02209090f2aa69429e1414daf3f9" + integrity sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw== + +hosted-git-info@^3.0.6: + version "3.0.8" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-3.0.8.tgz#6e35d4cc87af2c5f816e4cb9ce350ba87a3f370d" + integrity sha512-aXpmwoOhRBrw6X3j0h5RloK4x1OzsxMPyxqIHyNfSe2pypkVTZFpEiRoSipPEPlMrh0HW/XsjkJ5WgnCirpNUw== + dependencies: + lru-cache "^6.0.0" + +hosted-git-info@^4.0.0, hosted-git-info@^4.0.1: + version "4.1.0" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-4.1.0.tgz#827b82867e9ff1c8d0c4d9d53880397d2c86d224" + integrity sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA== + dependencies: + lru-cache "^6.0.0" + +hosted-git-info@^6.0.0: + version "6.1.1" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-6.1.1.tgz#629442c7889a69c05de604d52996b74fe6f26d58" + integrity sha512-r0EI+HBMcXadMrugk0GCQ+6BQV39PiWAZVfq7oIckeGiN7sjRGyQxPdft3nQekFTCQbYxLBH+/axZMeH8UX6+w== + dependencies: + lru-cache "^7.5.1" + +html-escaper@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" + integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== + +http-cache-semantics@^4.1.0, http-cache-semantics@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz#abe02fcb2985460bf0323be664436ec3476a6d5a" + integrity sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ== + +http-errors@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3" + integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== + dependencies: + depd "2.0.0" + inherits "2.0.4" + setprototypeof "1.2.0" + statuses "2.0.1" + toidentifier "1.0.1" + +http-proxy-agent@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz#8a8c8ef7f5932ccf953c296ca8291b95aa74aa3a" + integrity sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg== + dependencies: + "@tootallnate/once" "1" + agent-base "6" + debug "4" + +http-proxy-agent@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz#5129800203520d434f142bc78ff3c170800f2b43" + integrity sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w== + dependencies: + "@tootallnate/once" "2" + agent-base "6" + debug "4" + +https-proxy-agent@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz#c59ef224a04fe8b754f3db0063a25ea30d0005d6" + integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA== + dependencies: + agent-base "6" + debug "4" + +human-signals@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" + integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== + +humanize-ms@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/humanize-ms/-/humanize-ms-1.2.1.tgz#c46e3159a293f6b896da29316d8b6fe8bb79bbed" + integrity sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ== + dependencies: + ms "^2.0.0" + +iconv-lite@0.4.24, iconv-lite@^0.4.24: + version "0.4.24" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== + dependencies: + safer-buffer ">= 2.1.2 < 3" + +iconv-lite@^0.6.2: + version "0.6.3" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" + integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== + dependencies: + safer-buffer ">= 2.1.2 < 3.0.0" + +ieee754@^1.1.13, ieee754@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" + integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== + +ignore-walk@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-5.0.1.tgz#5f199e23e1288f518d90358d461387788a154776" + integrity sha512-yemi4pMf51WKT7khInJqAvsIGzoqYXblnsz0ql8tM+yi1EKYTY1evX4NAbJrLL/Aanr2HyZeluqU+Oi7MGHokw== + dependencies: + minimatch "^5.0.1" + +ignore-walk@^6.0.0: + version "6.0.4" + resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-6.0.4.tgz#89950be94b4f522225eb63a13c56badb639190e9" + integrity sha512-t7sv42WkwFkyKbivUCglsQW5YWMskWtbEf4MNKX5u/CCWHKSPzN4FtBQGsQZgCLbxOzpVlcbWVK5KB3auIOjSw== + dependencies: + minimatch "^9.0.0" + +ignore@^5.0.4, ignore@^5.2.0, ignore@^5.2.4: + version "5.3.1" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.1.tgz#5073e554cd42c5b33b394375f538b8593e34d4ef" + integrity sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw== + +immutable@^4.0.0-rc.12: + version "4.3.5" + resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.3.5.tgz#f8b436e66d59f99760dc577f5c99a4fd2a5cc5a0" + integrity sha512-8eabxkth9gZatlwl5TBuJnCsoTADlL6ftEr7A4qgdaTsPyreilDSnUk57SO+jfKcNtxPa22U5KK6DSeAYhpBJw== + +import-fresh@^3.2.1, import-fresh@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" + integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== + dependencies: + parent-module "^1.0.0" + resolve-from "^4.0.0" + +import-local@3.1.0, import-local@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.1.0.tgz#b4479df8a5fd44f6cdce24070675676063c95cb4" + integrity sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg== + dependencies: + pkg-dir "^4.2.0" + resolve-cwd "^3.0.0" + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== + +indent-string@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" + integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== + +infer-owner@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/infer-owner/-/infer-owner-1.0.4.tgz#c4cefcaa8e51051c2a40ba2ce8a3d27295af9467" + integrity sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A== + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +ini@^1.3.2, ini@^1.3.4, ini@^1.3.8: + version "1.3.8" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" + integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== + +init-package-json@5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/init-package-json/-/init-package-json-5.0.0.tgz#030cf0ea9c84cfc1b0dc2e898b45d171393e4b40" + integrity sha512-kBhlSheBfYmq3e0L1ii+VKe3zBTLL5lDCDWR+f9dLmEGSB3MqLlMlsolubSsyI88Bg6EA+BIMlomAnQ1SwgQBw== + dependencies: + npm-package-arg "^10.0.0" + promzard "^1.0.0" + read "^2.0.0" + read-package-json "^6.0.0" + semver "^7.3.5" + validate-npm-package-license "^3.0.4" + validate-npm-package-name "^5.0.0" + +inquirer@^8.2.4: + version "8.2.6" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-8.2.6.tgz#733b74888195d8d400a67ac332011b5fae5ea562" + integrity sha512-M1WuAmb7pn9zdFRtQYk26ZBoY043Sse0wVDdk4Bppr+JOXyQYybdtvK+l9wUibhtjdjvtoiNy8tk+EgsYIUqKg== + dependencies: + ansi-escapes "^4.2.1" + chalk "^4.1.1" + cli-cursor "^3.1.0" + cli-width "^3.0.0" + external-editor "^3.0.3" + figures "^3.0.0" + lodash "^4.17.21" + mute-stream "0.0.8" + ora "^5.4.1" + run-async "^2.4.0" + rxjs "^7.5.5" + string-width "^4.1.0" + strip-ansi "^6.0.0" + through "^2.3.6" + wrap-ansi "^6.0.1" + +internal-slot@^1.0.5: + version "1.0.7" + resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.7.tgz#c06dcca3ed874249881007b0a5523b172a190802" + integrity sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g== + dependencies: + es-errors "^1.3.0" + hasown "^2.0.0" + side-channel "^1.0.4" + +io-ts@1.10.4: + version "1.10.4" + resolved "https://registry.yarnpkg.com/io-ts/-/io-ts-1.10.4.tgz#cd5401b138de88e4f920adbcb7026e2d1967e6e2" + integrity sha512-b23PteSnYXSONJ6JQXRAlvJhuw8KOtkqa87W4wDtvMrud/DTJd5X+NpOOI+O/zZwVq6v0VLAaJ+1EDViKEuN9g== + dependencies: + fp-ts "^1.0.0" + +ip-address@^9.0.5: + version "9.0.5" + resolved "https://registry.yarnpkg.com/ip-address/-/ip-address-9.0.5.tgz#117a960819b08780c3bd1f14ef3c1cc1d3f3ea5a" + integrity sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g== + dependencies: + jsbn "1.1.0" + sprintf-js "^1.1.3" + +is-array-buffer@^3.0.2, is-array-buffer@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.4.tgz#7a1f92b3d61edd2bc65d24f130530ea93d7fae98" + integrity sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.2.1" + +is-arrayish@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== + +is-arrayish@^0.3.1: + version "0.3.2" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.3.2.tgz#4574a2ae56f7ab206896fb431eaeed066fdf8f03" + integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ== + +is-bigint@^1.0.1: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3" + integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg== + dependencies: + has-bigints "^1.0.1" + +is-binary-path@~2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" + integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== + dependencies: + binary-extensions "^2.0.0" + +is-boolean-object@^1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz#5c6dc200246dd9321ae4b885a114bb1f75f63719" + integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-buffer@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.5.tgz#ebc252e400d22ff8d77fa09888821a24a658c191" + integrity sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ== + +is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7: + version "1.2.7" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" + integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== + +is-ci@3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-3.0.1.tgz#db6ecbed1bd659c43dac0f45661e7674103d1867" + integrity sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ== + dependencies: + ci-info "^3.2.0" + +is-core-module@^2.13.0, is-core-module@^2.13.1, is-core-module@^2.5.0, is-core-module@^2.8.1: + version "2.13.1" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.13.1.tgz#ad0d7532c6fea9da1ebdc82742d74525c6273384" + integrity sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw== + dependencies: + hasown "^2.0.0" + +is-date-object@^1.0.1: + version "1.0.5" + resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" + integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== + dependencies: + has-tostringtag "^1.0.0" + +is-docker@^2.0.0, is-docker@^2.1.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa" + integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ== + +is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== + +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + +is-generator-fn@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118" + integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ== + +is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: + version "4.0.3" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== + dependencies: + is-extglob "^2.1.1" + +is-hex-prefixed@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-hex-prefixed/-/is-hex-prefixed-1.0.0.tgz#7d8d37e6ad77e5d127148913c573e082d777f554" + integrity sha512-WvtOiug1VFrE9v1Cydwm+FnXd3+w9GaeVUss5W4v/SLy3UW00vP+6iNF2SdnfiBoLy4bTqVdkftNGTUeOFVsbA== + +is-interactive@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-interactive/-/is-interactive-1.0.0.tgz#cea6e6ae5c870a7b0a0004070b7b587e0252912e" + integrity sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w== + +is-lambda@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-lambda/-/is-lambda-1.0.1.tgz#3d9877899e6a53efc0160504cde15f82e6f061d5" + integrity sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ== + +is-negative-zero@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.2.tgz#7bf6f03a28003b8b3965de3ac26f664d765f3150" + integrity sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA== + +is-number-object@^1.0.4: + version "1.0.7" + resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.7.tgz#59d50ada4c45251784e9904f5246c742f07a42fc" + integrity sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ== + dependencies: + has-tostringtag "^1.0.0" + +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + +is-obj@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-2.0.0.tgz#473fb05d973705e3fd9620545018ca8e22ef4982" + integrity sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w== + +is-path-inside@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" + integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== + +is-plain-obj@^1.0.0, is-plain-obj@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" + integrity sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg== + +is-plain-obj@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287" + integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== + +is-plain-object@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" + integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== + dependencies: + isobject "^3.0.1" + +is-plain-object@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-5.0.0.tgz#4427f50ab3429e9025ea7d52e9043a9ef4159344" + integrity sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q== + +is-regex@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" + integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-shared-array-buffer@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz#8f259c573b60b6a32d4058a1a07430c0a7344c79" + integrity sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA== + dependencies: + call-bind "^1.0.2" + +is-ssh@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/is-ssh/-/is-ssh-1.4.0.tgz#4f8220601d2839d8fa624b3106f8e8884f01b8b2" + integrity sha512-x7+VxdxOdlV3CYpjvRLBv5Lo9OJerlYanjwFrPR9fuGPjCiNiCzFgAWpiLAohSbsnH4ZAys3SBh+hq5rJosxUQ== + dependencies: + protocols "^2.0.1" + +is-stream@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.0.tgz#bde9c32680d6fae04129d6ac9d921ce7815f78e3" + integrity sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw== + +is-stream@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" + integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== + +is-string@^1.0.5, is-string@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd" + integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== + dependencies: + has-tostringtag "^1.0.0" + +is-symbol@^1.0.2, is-symbol@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c" + integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== + dependencies: + has-symbols "^1.0.2" + +is-text-path@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-text-path/-/is-text-path-1.0.1.tgz#4e1aa0fb51bfbcb3e92688001397202c1775b66e" + integrity sha512-xFuJpne9oFz5qDaodwmmG08e3CawH/2ZV8Qqza1Ko7Sk8POWbkRdwIoAWVhqvq0XeUzANEhKo2n0IXUGBm7A/w== + dependencies: + text-extensions "^1.0.0" + +is-typed-array@^1.1.10, is-typed-array@^1.1.12, is-typed-array@^1.1.13, is-typed-array@^1.1.9: + version "1.1.13" + resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.13.tgz#d6c5ca56df62334959322d7d7dd1cca50debe229" + integrity sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw== + dependencies: + which-typed-array "^1.1.14" + +is-unicode-supported@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" + integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== + +is-weakref@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2" + integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ== + dependencies: + call-bind "^1.0.2" + +is-windows@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" + integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== + +is-wsl@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271" + integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== + dependencies: + is-docker "^2.0.0" + +isarray@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" + integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== + +isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== + +isobject@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" + integrity sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg== + +isows@1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/isows/-/isows-1.0.3.tgz#93c1cf0575daf56e7120bab5c8c448b0809d0d74" + integrity sha512-2cKei4vlmg2cxEjm3wVSqn8pcoRF/LX/wpifuuNquFO4SQmPwarClT+SUCA2lt+l581tTeZIPIZuIDo2jWN1fg== + +istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.2.0: + version "3.2.2" + resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz#2d166c4b0644d43a39f04bf6c2edd1e585f31756" + integrity sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg== + +istanbul-lib-instrument@^5.0.4: + version "5.2.1" + resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz#d10c8885c2125574e1c231cacadf955675e1ce3d" + integrity sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg== + dependencies: + "@babel/core" "^7.12.3" + "@babel/parser" "^7.14.7" + "@istanbuljs/schema" "^0.1.2" + istanbul-lib-coverage "^3.2.0" + semver "^6.3.0" + +istanbul-lib-instrument@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.1.tgz#71e87707e8041428732518c6fb5211761753fbdf" + integrity sha512-EAMEJBsYuyyztxMxW3g7ugGPkrZsV57v0Hmv3mm1uQsmB+QnZuepg731CRaIgeUVSdmsTngOkSnauNF8p7FIhA== + dependencies: + "@babel/core" "^7.12.3" + "@babel/parser" "^7.14.7" + "@istanbuljs/schema" "^0.1.2" + istanbul-lib-coverage "^3.2.0" + semver "^7.5.4" + +istanbul-lib-report@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz#908305bac9a5bd175ac6a74489eafd0fc2445a7d" + integrity sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw== + dependencies: + istanbul-lib-coverage "^3.0.0" + make-dir "^4.0.0" + supports-color "^7.1.0" + +istanbul-lib-source-maps@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz#895f3a709fcfba34c6de5a42939022f3e4358551" + integrity sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw== + dependencies: + debug "^4.1.1" + istanbul-lib-coverage "^3.0.0" + source-map "^0.6.1" + +istanbul-reports@^3.1.3: + version "3.1.6" + resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.1.6.tgz#2544bcab4768154281a2f0870471902704ccaa1a" + integrity sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg== + dependencies: + html-escaper "^2.0.0" + istanbul-lib-report "^3.0.0" + +jackspeak@^2.3.5: + version "2.3.6" + resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-2.3.6.tgz#647ecc472238aee4b06ac0e461acc21a8c505ca8" + integrity sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ== + dependencies: + "@isaacs/cliui" "^8.0.2" + optionalDependencies: + "@pkgjs/parseargs" "^0.11.0" + +jake@^10.8.5: + version "10.8.7" + resolved "https://registry.yarnpkg.com/jake/-/jake-10.8.7.tgz#63a32821177940c33f356e0ba44ff9d34e1c7d8f" + integrity sha512-ZDi3aP+fG/LchyBzUM804VjddnwfSfsdeYkwt8NcbKRvo4rFkjhs456iLFn3k2ZUWvNe4i48WACDbza8fhq2+w== + dependencies: + async "^3.2.3" + chalk "^4.0.2" + filelist "^1.0.4" + minimatch "^3.1.2" + +jest-changed-files@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-29.7.0.tgz#1c06d07e77c78e1585d020424dedc10d6e17ac3a" + integrity sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w== + dependencies: + execa "^5.0.0" + jest-util "^29.7.0" + p-limit "^3.1.0" + +jest-circus@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-circus/-/jest-circus-29.7.0.tgz#b6817a45fcc835d8b16d5962d0c026473ee3668a" + integrity sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw== + dependencies: + "@jest/environment" "^29.7.0" + "@jest/expect" "^29.7.0" + "@jest/test-result" "^29.7.0" + "@jest/types" "^29.6.3" + "@types/node" "*" + chalk "^4.0.0" + co "^4.6.0" + dedent "^1.0.0" + is-generator-fn "^2.0.0" + jest-each "^29.7.0" + jest-matcher-utils "^29.7.0" + jest-message-util "^29.7.0" + jest-runtime "^29.7.0" + jest-snapshot "^29.7.0" + jest-util "^29.7.0" + p-limit "^3.1.0" + pretty-format "^29.7.0" + pure-rand "^6.0.0" + slash "^3.0.0" + stack-utils "^2.0.3" + +jest-cli@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-29.7.0.tgz#5592c940798e0cae677eec169264f2d839a37995" + integrity sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg== + dependencies: + "@jest/core" "^29.7.0" + "@jest/test-result" "^29.7.0" + "@jest/types" "^29.6.3" + chalk "^4.0.0" + create-jest "^29.7.0" + exit "^0.1.2" + import-local "^3.0.2" + jest-config "^29.7.0" + jest-util "^29.7.0" + jest-validate "^29.7.0" + yargs "^17.3.1" + +jest-config@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-29.7.0.tgz#bcbda8806dbcc01b1e316a46bb74085a84b0245f" + integrity sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ== + dependencies: + "@babel/core" "^7.11.6" + "@jest/test-sequencer" "^29.7.0" + "@jest/types" "^29.6.3" + babel-jest "^29.7.0" + chalk "^4.0.0" + ci-info "^3.2.0" + deepmerge "^4.2.2" + glob "^7.1.3" + graceful-fs "^4.2.9" + jest-circus "^29.7.0" + jest-environment-node "^29.7.0" + jest-get-type "^29.6.3" + jest-regex-util "^29.6.3" + jest-resolve "^29.7.0" + jest-runner "^29.7.0" + jest-util "^29.7.0" + jest-validate "^29.7.0" + micromatch "^4.0.4" + parse-json "^5.2.0" + pretty-format "^29.7.0" + slash "^3.0.0" + strip-json-comments "^3.1.1" + +"jest-diff@>=29.4.3 < 30", jest-diff@^29.4.1, jest-diff@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-29.7.0.tgz#017934a66ebb7ecf6f205e84699be10afd70458a" + integrity sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw== + dependencies: + chalk "^4.0.0" + diff-sequences "^29.6.3" + jest-get-type "^29.6.3" + pretty-format "^29.7.0" + +jest-docblock@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-29.7.0.tgz#8fddb6adc3cdc955c93e2a87f61cfd350d5d119a" + integrity sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g== + dependencies: + detect-newline "^3.0.0" + +jest-each@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-29.7.0.tgz#162a9b3f2328bdd991beaabffbb74745e56577d1" + integrity sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ== + dependencies: + "@jest/types" "^29.6.3" + chalk "^4.0.0" + jest-get-type "^29.6.3" + jest-util "^29.7.0" + pretty-format "^29.7.0" + +jest-environment-node@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-29.7.0.tgz#0b93e111dda8ec120bc8300e6d1fb9576e164376" + integrity sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw== + dependencies: + "@jest/environment" "^29.7.0" + "@jest/fake-timers" "^29.7.0" + "@jest/types" "^29.6.3" + "@types/node" "*" + jest-mock "^29.7.0" + jest-util "^29.7.0" + +jest-get-type@^29.6.3: + version "29.6.3" + resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-29.6.3.tgz#36f499fdcea197c1045a127319c0481723908fd1" + integrity sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw== + +jest-haste-map@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-29.7.0.tgz#3c2396524482f5a0506376e6c858c3bbcc17b104" + integrity sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA== + dependencies: + "@jest/types" "^29.6.3" + "@types/graceful-fs" "^4.1.3" + "@types/node" "*" + anymatch "^3.0.3" + fb-watchman "^2.0.0" + graceful-fs "^4.2.9" + jest-regex-util "^29.6.3" + jest-util "^29.7.0" + jest-worker "^29.7.0" + micromatch "^4.0.4" + walker "^1.0.8" + optionalDependencies: + fsevents "^2.3.2" + +jest-leak-detector@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz#5b7ec0dadfdfec0ca383dc9aa016d36b5ea4c728" + integrity sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw== + dependencies: + jest-get-type "^29.6.3" + pretty-format "^29.7.0" + +jest-matcher-utils@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz#ae8fec79ff249fd592ce80e3ee474e83a6c44f12" + integrity sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g== + dependencies: + chalk "^4.0.0" + jest-diff "^29.7.0" + jest-get-type "^29.6.3" + pretty-format "^29.7.0" + +jest-message-util@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-29.7.0.tgz#8bc392e204e95dfe7564abbe72a404e28e51f7f3" + integrity sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w== + dependencies: + "@babel/code-frame" "^7.12.13" + "@jest/types" "^29.6.3" + "@types/stack-utils" "^2.0.0" + chalk "^4.0.0" + graceful-fs "^4.2.9" + micromatch "^4.0.4" + pretty-format "^29.7.0" + slash "^3.0.0" + stack-utils "^2.0.3" + +jest-mock@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-29.7.0.tgz#4e836cf60e99c6fcfabe9f99d017f3fdd50a6347" + integrity sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw== + dependencies: + "@jest/types" "^29.6.3" + "@types/node" "*" + jest-util "^29.7.0" + +jest-pnp-resolver@^1.2.2: + version "1.2.3" + resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz#930b1546164d4ad5937d5540e711d4d38d4cad2e" + integrity sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w== + +jest-regex-util@^29.6.3: + version "29.6.3" + resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-29.6.3.tgz#4a556d9c776af68e1c5f48194f4d0327d24e8a52" + integrity sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg== + +jest-resolve-dependencies@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz#1b04f2c095f37fc776ff40803dc92921b1e88428" + integrity sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA== + dependencies: + jest-regex-util "^29.6.3" + jest-snapshot "^29.7.0" + +jest-resolve@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-29.7.0.tgz#64d6a8992dd26f635ab0c01e5eef4399c6bcbc30" + integrity sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA== + dependencies: + chalk "^4.0.0" + graceful-fs "^4.2.9" + jest-haste-map "^29.7.0" + jest-pnp-resolver "^1.2.2" + jest-util "^29.7.0" + jest-validate "^29.7.0" + resolve "^1.20.0" + resolve.exports "^2.0.0" + slash "^3.0.0" + +jest-runner@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-29.7.0.tgz#809af072d408a53dcfd2e849a4c976d3132f718e" + integrity sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ== + dependencies: + "@jest/console" "^29.7.0" + "@jest/environment" "^29.7.0" + "@jest/test-result" "^29.7.0" + "@jest/transform" "^29.7.0" + "@jest/types" "^29.6.3" + "@types/node" "*" + chalk "^4.0.0" + emittery "^0.13.1" + graceful-fs "^4.2.9" + jest-docblock "^29.7.0" + jest-environment-node "^29.7.0" + jest-haste-map "^29.7.0" + jest-leak-detector "^29.7.0" + jest-message-util "^29.7.0" + jest-resolve "^29.7.0" + jest-runtime "^29.7.0" + jest-util "^29.7.0" + jest-watcher "^29.7.0" + jest-worker "^29.7.0" + p-limit "^3.1.0" + source-map-support "0.5.13" + +jest-runtime@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-29.7.0.tgz#efecb3141cf7d3767a3a0cc8f7c9990587d3d817" + integrity sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ== + dependencies: + "@jest/environment" "^29.7.0" + "@jest/fake-timers" "^29.7.0" + "@jest/globals" "^29.7.0" + "@jest/source-map" "^29.6.3" + "@jest/test-result" "^29.7.0" + "@jest/transform" "^29.7.0" + "@jest/types" "^29.6.3" + "@types/node" "*" + chalk "^4.0.0" + cjs-module-lexer "^1.0.0" + collect-v8-coverage "^1.0.0" + glob "^7.1.3" + graceful-fs "^4.2.9" + jest-haste-map "^29.7.0" + jest-message-util "^29.7.0" + jest-mock "^29.7.0" + jest-regex-util "^29.6.3" + jest-resolve "^29.7.0" + jest-snapshot "^29.7.0" + jest-util "^29.7.0" + slash "^3.0.0" + strip-bom "^4.0.0" + +jest-snapshot@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-29.7.0.tgz#c2c574c3f51865da1bb329036778a69bf88a6be5" + integrity sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw== + dependencies: + "@babel/core" "^7.11.6" + "@babel/generator" "^7.7.2" + "@babel/plugin-syntax-jsx" "^7.7.2" + "@babel/plugin-syntax-typescript" "^7.7.2" + "@babel/types" "^7.3.3" + "@jest/expect-utils" "^29.7.0" + "@jest/transform" "^29.7.0" + "@jest/types" "^29.6.3" + babel-preset-current-node-syntax "^1.0.0" + chalk "^4.0.0" + expect "^29.7.0" + graceful-fs "^4.2.9" + jest-diff "^29.7.0" + jest-get-type "^29.6.3" + jest-matcher-utils "^29.7.0" + jest-message-util "^29.7.0" + jest-util "^29.7.0" + natural-compare "^1.4.0" + pretty-format "^29.7.0" + semver "^7.5.3" + +jest-util@^29.0.0, jest-util@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-29.7.0.tgz#23c2b62bfb22be82b44de98055802ff3710fc0bc" + integrity sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA== + dependencies: + "@jest/types" "^29.6.3" + "@types/node" "*" + chalk "^4.0.0" + ci-info "^3.2.0" + graceful-fs "^4.2.9" + picomatch "^2.2.3" + +jest-validate@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-29.7.0.tgz#7bf705511c64da591d46b15fce41400d52147d9c" + integrity sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw== + dependencies: + "@jest/types" "^29.6.3" + camelcase "^6.2.0" + chalk "^4.0.0" + jest-get-type "^29.6.3" + leven "^3.1.0" + pretty-format "^29.7.0" + +jest-watcher@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-29.7.0.tgz#7810d30d619c3a62093223ce6bb359ca1b28a2f2" + integrity sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g== + dependencies: + "@jest/test-result" "^29.7.0" + "@jest/types" "^29.6.3" + "@types/node" "*" + ansi-escapes "^4.2.1" + chalk "^4.0.0" + emittery "^0.13.1" + jest-util "^29.7.0" + string-length "^4.0.1" + +jest-worker@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-29.7.0.tgz#acad073acbbaeb7262bd5389e1bcf43e10058d4a" + integrity sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw== + dependencies: + "@types/node" "*" + jest-util "^29.7.0" + merge-stream "^2.0.0" + supports-color "^8.0.0" + +jest@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest/-/jest-29.7.0.tgz#994676fc24177f088f1c5e3737f5697204ff2613" + integrity sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw== + dependencies: + "@jest/core" "^29.7.0" + "@jest/types" "^29.6.3" + import-local "^3.0.2" + jest-cli "^29.7.0" + +js-sdsl@^4.1.4: + version "4.4.2" + resolved "https://registry.yarnpkg.com/js-sdsl/-/js-sdsl-4.4.2.tgz#2e3c031b1f47d3aca8b775532e3ebb0818e7f847" + integrity sha512-dwXFwByc/ajSV6m5bcKAPwe4yDDF6D614pxmIi5odytzxRlwqF6nwoiCek80Ixc7Cvma5awClxrzFtxCQvcM8w== + +js-sha3@0.8.0, js-sha3@^0.8.0: + version "0.8.0" + resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.8.0.tgz#b9b7a5da73afad7dedd0f8c463954cbde6818840" + integrity sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q== + +js-tokens@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +js-yaml@4.1.0, js-yaml@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" + integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== + dependencies: + argparse "^2.0.1" + +js-yaml@^3.10.0, js-yaml@^3.13.1: + version "3.14.1" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" + integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + +jsbn@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-1.1.0.tgz#b01307cb29b618a1ed26ec79e911f803c4da0040" + integrity sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A== + +jsesc@^2.5.1: + version "2.5.2" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" + integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== + +json-buffer@3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" + integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== + +json-parse-better-errors@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" + integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== + +json-parse-even-better-errors@^2.3.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" + integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== + +json-parse-even-better-errors@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.1.tgz#02bb29fb5da90b5444581749c22cedd3597c6cb0" + integrity sha512-aatBvbL26wVUCLmbWdCpeu9iF5wOyWpagiKkInA+kfws3sWdBrTnsvN2CKcyCYyUrc7rebNBlK6+kteg7ksecg== + +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== + +json-stable-stringify-without-jsonify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" + integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== + +json-stringify-safe@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" + integrity sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA== + +json5@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.2.tgz#63d98d60f21b313b77c4d6da18bfa69d80e1d593" + integrity sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA== + dependencies: + minimist "^1.2.0" + +json5@^2.2.2, json5@^2.2.3: + version "2.2.3" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" + integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== + +jsonc-parser@3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/jsonc-parser/-/jsonc-parser-3.2.0.tgz#31ff3f4c2b9793f89c67212627c51c6394f88e76" + integrity sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w== + +jsonc-parser@^3.2.0: + version "3.2.1" + resolved "https://registry.yarnpkg.com/jsonc-parser/-/jsonc-parser-3.2.1.tgz#031904571ccf929d7670ee8c547545081cb37f1a" + integrity sha512-AilxAyFOAcK5wA1+LeaySVBrHsGQvUFCDWXKpZjzaL0PqW+xfBOttn8GNtWKFWqneyMZj41MWF9Kl6iPWLwgOA== + +jsonfile@^2.1.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-2.4.0.tgz#3736a2b428b87bbda0cc83b53fa3d633a35c2ae8" + integrity sha512-PKllAqbgLgxHaj8TElYymKCAgrASebJrWpTnEkOaTowt23VKXXN0sUeriJ+eh7y6ufb/CC5ap11pz71/cM0hUw== + optionalDependencies: + graceful-fs "^4.1.6" + +jsonfile@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" + integrity sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg== + optionalDependencies: + graceful-fs "^4.1.6" + +jsonfile@^6.0.1: + version "6.1.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" + integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== + dependencies: + universalify "^2.0.0" + optionalDependencies: + graceful-fs "^4.1.6" + +jsonparse@^1.2.0, jsonparse@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280" + integrity sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg== + +keccak@3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/keccak/-/keccak-3.0.2.tgz#4c2c6e8c54e04f2670ee49fa734eb9da152206e0" + integrity sha512-PyKKjkH53wDMLGrvmRGSNWgmSxZOUqbnXwKL9tmgbFYA1iAYqW21kfR7mZXV0MlESiefxQQE9X9fTa3X+2MPDQ== + dependencies: + node-addon-api "^2.0.0" + node-gyp-build "^4.2.0" + readable-stream "^3.6.0" + +keccak@^3.0.0, keccak@^3.0.2: + version "3.0.4" + resolved "https://registry.yarnpkg.com/keccak/-/keccak-3.0.4.tgz#edc09b89e633c0549da444432ecf062ffadee86d" + integrity sha512-3vKuW0jV8J3XNTzvfyicFR5qvxrSAGl7KIhvgOu5cmWwM7tZRj3fMbj/pfIf4be7aznbc+prBWGjywox/g2Y6Q== + dependencies: + node-addon-api "^2.0.0" + node-gyp-build "^4.2.0" + readable-stream "^3.6.0" + +keyv@^4.5.3: + version "4.5.4" + resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93" + integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== + dependencies: + json-buffer "3.0.1" + +kind-of@^6.0.2, kind-of@^6.0.3: + version "6.0.3" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" + integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== + +klaw@^1.0.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/klaw/-/klaw-1.3.1.tgz#4088433b46b3b1ba259d78785d8e96f73ba02439" + integrity sha512-TED5xi9gGQjGpNnvRWknrwAB1eL5GciPfVFOt3Vk1OJCVDQbzuSfrF3hkUQKlsgKrG1F+0t5W0m+Fje1jIt8rw== + optionalDependencies: + graceful-fs "^4.1.9" + +kleur@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" + integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== + +kuler@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/kuler/-/kuler-2.0.0.tgz#e2c570a3800388fb44407e851531c1d670b061b3" + integrity sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A== + +lerna-changelog@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/lerna-changelog/-/lerna-changelog-2.2.0.tgz#c43813bba81e30cdeb20aabaef4da390f0f38e41" + integrity sha512-yjYNAHrbnw8xYFKmYWJEP52Tk4xSdlNmzpYr26+3glbSGDmpe8UMo8f9DlEntjGufL+opup421oVTXcLshwAaQ== + dependencies: + chalk "^4.0.0" + cli-highlight "^2.1.11" + execa "^5.0.0" + hosted-git-info "^4.0.0" + make-fetch-happen "^9.0.0" + p-map "^3.0.0" + progress "^2.0.0" + yargs "^17.1.0" + +lerna@^7.2.0: + version "7.4.2" + resolved "https://registry.yarnpkg.com/lerna/-/lerna-7.4.2.tgz#03497125d7b7c8d463eebfe17a701b16bde2ad09" + integrity sha512-gxavfzHfJ4JL30OvMunmlm4Anw7d7Tq6tdVHzUukLdS9nWnxCN/QB21qR+VJYp5tcyXogHKbdUEGh6qmeyzxSA== + dependencies: + "@lerna/child-process" "7.4.2" + "@lerna/create" "7.4.2" + "@npmcli/run-script" "6.0.2" + "@nx/devkit" ">=16.5.1 < 17" + "@octokit/plugin-enterprise-rest" "6.0.1" + "@octokit/rest" "19.0.11" + byte-size "8.1.1" + chalk "4.1.0" + clone-deep "4.0.1" + cmd-shim "6.0.1" + columnify "1.6.0" + conventional-changelog-angular "7.0.0" + conventional-changelog-core "5.0.1" + conventional-recommended-bump "7.0.1" + cosmiconfig "^8.2.0" + dedent "0.7.0" + envinfo "7.8.1" + execa "5.0.0" + fs-extra "^11.1.1" + get-port "5.1.1" + get-stream "6.0.0" + git-url-parse "13.1.0" + glob-parent "5.1.2" + globby "11.1.0" + graceful-fs "4.2.11" + has-unicode "2.0.1" + import-local "3.1.0" + ini "^1.3.8" + init-package-json "5.0.0" + inquirer "^8.2.4" + is-ci "3.0.1" + is-stream "2.0.0" + jest-diff ">=29.4.3 < 30" + js-yaml "4.1.0" + libnpmaccess "7.0.2" + libnpmpublish "7.3.0" + load-json-file "6.2.0" + lodash "^4.17.21" + make-dir "4.0.0" + minimatch "3.0.5" + multimatch "5.0.0" + node-fetch "2.6.7" + npm-package-arg "8.1.1" + npm-packlist "5.1.1" + npm-registry-fetch "^14.0.5" + npmlog "^6.0.2" + nx ">=16.5.1 < 17" + p-map "4.0.0" + p-map-series "2.1.0" + p-pipe "3.1.0" + p-queue "6.6.2" + p-reduce "2.1.0" + p-waterfall "2.1.1" + pacote "^15.2.0" + pify "5.0.0" + read-cmd-shim "4.0.0" + read-package-json "6.0.4" + resolve-from "5.0.0" + rimraf "^4.4.1" + semver "^7.3.8" + signal-exit "3.0.7" + slash "3.0.0" + ssri "^9.0.1" + strong-log-transformer "2.1.0" + tar "6.1.11" + temp-dir "1.0.0" + typescript ">=3 < 6" + upath "2.0.1" + uuid "^9.0.0" + validate-npm-package-license "3.0.4" + validate-npm-package-name "5.0.0" + write-file-atomic "5.0.1" + write-pkg "4.0.0" + yargs "16.2.0" + yargs-parser "20.2.4" + +level-concat-iterator@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/level-concat-iterator/-/level-concat-iterator-3.1.0.tgz#5235b1f744bc34847ed65a50548aa88d22e881cf" + integrity sha512-BWRCMHBxbIqPxJ8vHOvKUsaO0v1sLYZtjN3K2iZJsRBYtp+ONsY6Jfi6hy9K3+zolgQRryhIn2NRZjZnWJ9NmQ== + dependencies: + catering "^2.1.0" + +level-supports@^2.0.1: + version "2.1.0" + resolved "https://registry.yarnpkg.com/level-supports/-/level-supports-2.1.0.tgz#9af908d853597ecd592293b2fad124375be79c5f" + integrity sha512-E486g1NCjW5cF78KGPrMDRBYzPuueMZ6VBXHT6gC7A8UYWGiM14fGgp+s/L1oFfDWSPV/+SFkYCmZ0SiESkRKA== + +level-supports@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/level-supports/-/level-supports-4.0.1.tgz#431546f9d81f10ff0fea0e74533a0e875c08c66a" + integrity sha512-PbXpve8rKeNcZ9C1mUicC9auIYFyGpkV9/i6g76tLgANwWhtG2v7I4xNBUlkn3lE2/dZF3Pi0ygYGtLc4RXXdA== + +level-transcoder@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/level-transcoder/-/level-transcoder-1.0.1.tgz#f8cef5990c4f1283d4c86d949e73631b0bc8ba9c" + integrity sha512-t7bFwFtsQeD8cl8NIoQ2iwxA0CL/9IFw7/9gAjOonH0PWTTiRfY7Hq+Ejbsxh86tXobDQ6IOiddjNYIfOBs06w== + dependencies: + buffer "^6.0.3" + module-error "^1.0.1" + +level@^8.0.0: + version "8.0.1" + resolved "https://registry.yarnpkg.com/level/-/level-8.0.1.tgz#737161db1bc317193aca4e7b6f436e7e1df64379" + integrity sha512-oPBGkheysuw7DmzFQYyFe8NAia5jFLAgEnkgWnK3OXAuJr8qFT+xBQIwokAZPME2bhPFzS8hlYcL16m8UZrtwQ== + dependencies: + abstract-level "^1.0.4" + browser-level "^1.0.1" + classic-level "^1.2.0" + +leveldown@6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/leveldown/-/leveldown-6.1.0.tgz#7ab1297706f70c657d1a72b31b40323aa612b9ee" + integrity sha512-8C7oJDT44JXxh04aSSsfcMI8YiaGRhOFI9/pMEL7nWJLVsWajDPTRxsSHTM2WcTVY5nXM+SuRHzPPi0GbnDX+w== + dependencies: + abstract-leveldown "^7.2.0" + napi-macros "~2.0.0" + node-gyp-build "^4.3.0" + +leven@2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/leven/-/leven-2.1.0.tgz#c2e7a9f772094dee9d34202ae8acce4687875580" + integrity sha512-nvVPLpIHUxCUoRLrFqTgSxXJ614d8AgQoWl7zPe/2VadE8+1dpU3LBhowRuBAcuwruWtOdD8oYC9jDNJjXDPyA== + +leven@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" + integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== + +levn@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" + integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== + dependencies: + prelude-ls "^1.2.1" + type-check "~0.4.0" + +libnpmaccess@7.0.2: + version "7.0.2" + resolved "https://registry.yarnpkg.com/libnpmaccess/-/libnpmaccess-7.0.2.tgz#7f056c8c933dd9c8ba771fa6493556b53c5aac52" + integrity sha512-vHBVMw1JFMTgEk15zRsJuSAg7QtGGHpUSEfnbcRL1/gTBag9iEfJbyjpDmdJmwMhvpoLoNBtdAUCdGnaP32hhw== + dependencies: + npm-package-arg "^10.1.0" + npm-registry-fetch "^14.0.3" + +libnpmpublish@7.3.0: + version "7.3.0" + resolved "https://registry.yarnpkg.com/libnpmpublish/-/libnpmpublish-7.3.0.tgz#2ceb2b36866d75a6cd7b4aa748808169f4d17e37" + integrity sha512-fHUxw5VJhZCNSls0KLNEG0mCD2PN1i14gH5elGOgiVnU3VgTcRahagYP2LKI1m0tFCJ+XrAm0zVYyF5RCbXzcg== + dependencies: + ci-info "^3.6.1" + normalize-package-data "^5.0.0" + npm-package-arg "^10.1.0" + npm-registry-fetch "^14.0.3" + proc-log "^3.0.0" + semver "^7.3.7" + sigstore "^1.4.0" + ssri "^10.0.1" + +lines-and-columns@^1.1.6: + version "1.2.4" + resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" + integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== + +lines-and-columns@~2.0.3: + version "2.0.4" + resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-2.0.4.tgz#d00318855905d2660d8c0822e3f5a4715855fc42" + integrity sha512-wM1+Z03eypVAVUCE7QdSqpVIvelbOakn1M0bPDoA4SGWPx3sNDVUiMo3L6To6WWGClB7VyXnhQ4Sn7gxiJbE6A== + +load-json-file@6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-6.2.0.tgz#5c7770b42cafa97074ca2848707c61662f4251a1" + integrity sha512-gUD/epcRms75Cw8RT1pUdHugZYM5ce64ucs2GEISABwkRsOQr0q2wm/MV2TKThycIe5e0ytRweW2RZxclogCdQ== + dependencies: + graceful-fs "^4.1.15" + parse-json "^5.0.0" + strip-bom "^4.0.0" + type-fest "^0.6.0" + +load-json-file@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-4.0.0.tgz#2f5f45ab91e33216234fd53adab668eb4ec0993b" + integrity sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw== + dependencies: + graceful-fs "^4.1.2" + parse-json "^4.0.0" + pify "^3.0.0" + strip-bom "^3.0.0" + +locate-path@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" + integrity sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA== + dependencies: + p-locate "^2.0.0" + path-exists "^3.0.0" + +locate-path@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" + integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== + dependencies: + p-locate "^4.1.0" + +locate-path@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" + integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== + dependencies: + p-locate "^5.0.0" + +lodash.ismatch@^4.4.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/lodash.ismatch/-/lodash.ismatch-4.4.0.tgz#756cb5150ca3ba6f11085a78849645f188f85f37" + integrity sha512-fPMfXjGQEV9Xsq/8MTSgUf255gawYRbjwMyDbcvDhXgV7enSZA0hynz6vMPnpAb5iONEzBHBPsT+0zes5Z301g== + +lodash.memoize@4.x: + version "4.1.2" + resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" + integrity sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag== + +lodash.merge@^4.6.2: + version "4.6.2" + resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" + integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== + +lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.21: + version "4.17.21" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== + +log-symbols@4.1.0, log-symbols@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" + integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== + dependencies: + chalk "^4.1.0" + is-unicode-supported "^0.1.0" + +logform@^2.3.2, logform@^2.4.0: + version "2.6.0" + resolved "https://registry.yarnpkg.com/logform/-/logform-2.6.0.tgz#8c82a983f05d6eaeb2d75e3decae7a768b2bf9b5" + integrity sha512-1ulHeNPp6k/LD8H91o7VYFBng5i1BDE7HoKxVbZiGFidS1Rj65qcywLxX+pVfAPoQJEjRdvKcusKwOupHCVOVQ== + dependencies: + "@colors/colors" "1.6.0" + "@types/triple-beam" "^1.3.2" + fecha "^4.2.0" + ms "^2.1.1" + safe-stable-stringify "^2.3.1" + triple-beam "^1.3.0" + +lru-cache@^10.0.1, "lru-cache@^9.1.1 || ^10.0.0": + version "10.2.0" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.2.0.tgz#0bd445ca57363465900f4d1f9bd8db343a4d95c3" + integrity sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q== + +lru-cache@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" + integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== + dependencies: + yallist "^3.0.2" + +lru-cache@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" + integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== + dependencies: + yallist "^4.0.0" + +lru-cache@^7.4.4, lru-cache@^7.5.1, lru-cache@^7.7.1: + version "7.18.3" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-7.18.3.tgz#f793896e0fd0e954a59dfdd82f0773808df6aa89" + integrity sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA== + +lru_map@^0.3.3: + version "0.3.3" + resolved "https://registry.yarnpkg.com/lru_map/-/lru_map-0.3.3.tgz#b5c8351b9464cbd750335a79650a0ec0e56118dd" + integrity sha512-Pn9cox5CsMYngeDbmChANltQl+5pi6XmTrraMSzhPmMBbmgcxmqWry0U3PGapCU1yB4/LqCcom7qhHZiF/jGfQ== + +lunr@^2.3.9: + version "2.3.9" + resolved "https://registry.yarnpkg.com/lunr/-/lunr-2.3.9.tgz#18b123142832337dd6e964df1a5a7707b25d35e1" + integrity sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow== + +make-dir@4.0.0, make-dir@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-4.0.0.tgz#c3c2307a771277cd9638305f915c29ae741b614e" + integrity sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw== + dependencies: + semver "^7.5.3" + +make-dir@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5" + integrity sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA== + dependencies: + pify "^4.0.1" + semver "^5.6.0" + +make-dir@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" + integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== + dependencies: + semver "^6.0.0" + +make-error@1.x, make-error@^1.1.1: + version "1.3.6" + resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" + integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== + +make-fetch-happen@^10.0.3: + version "10.2.1" + resolved "https://registry.yarnpkg.com/make-fetch-happen/-/make-fetch-happen-10.2.1.tgz#f5e3835c5e9817b617f2770870d9492d28678164" + integrity sha512-NgOPbRiaQM10DYXvN3/hhGVI2M5MtITFryzBGxHM5p4wnFxsVCbxkrBrDsk+EZ5OB4jEOT7AjDxtdF+KVEFT7w== + dependencies: + agentkeepalive "^4.2.1" + cacache "^16.1.0" + http-cache-semantics "^4.1.0" + http-proxy-agent "^5.0.0" + https-proxy-agent "^5.0.0" + is-lambda "^1.0.1" + lru-cache "^7.7.1" + minipass "^3.1.6" + minipass-collect "^1.0.2" + minipass-fetch "^2.0.3" + minipass-flush "^1.0.5" + minipass-pipeline "^1.2.4" + negotiator "^0.6.3" + promise-retry "^2.0.1" + socks-proxy-agent "^7.0.0" + ssri "^9.0.0" + +make-fetch-happen@^11.0.0, make-fetch-happen@^11.0.1, make-fetch-happen@^11.1.1: + version "11.1.1" + resolved "https://registry.yarnpkg.com/make-fetch-happen/-/make-fetch-happen-11.1.1.tgz#85ceb98079584a9523d4bf71d32996e7e208549f" + integrity sha512-rLWS7GCSTcEujjVBs2YqG7Y4643u8ucvCJeSRqiLYhesrDuzeuFIk37xREzAsfQaqzl8b9rNCE4m6J8tvX4Q8w== + dependencies: + agentkeepalive "^4.2.1" + cacache "^17.0.0" + http-cache-semantics "^4.1.1" + http-proxy-agent "^5.0.0" + https-proxy-agent "^5.0.0" + is-lambda "^1.0.1" + lru-cache "^7.7.1" + minipass "^5.0.0" + minipass-fetch "^3.0.0" + minipass-flush "^1.0.5" + minipass-pipeline "^1.2.4" + negotiator "^0.6.3" + promise-retry "^2.0.1" + socks-proxy-agent "^7.0.0" + ssri "^10.0.0" + +make-fetch-happen@^9.0.0: + version "9.1.0" + resolved "https://registry.yarnpkg.com/make-fetch-happen/-/make-fetch-happen-9.1.0.tgz#53085a09e7971433e6765f7971bf63f4e05cb968" + integrity sha512-+zopwDy7DNknmwPQplem5lAZX/eCOzSvSNNcSKm5eVwTkOBzoktEfXsa9L23J/GIRhxRsaxzkPEhrJEpE2F4Gg== + dependencies: + agentkeepalive "^4.1.3" + cacache "^15.2.0" + http-cache-semantics "^4.1.0" + http-proxy-agent "^4.0.1" + https-proxy-agent "^5.0.0" + is-lambda "^1.0.1" + lru-cache "^6.0.0" + minipass "^3.1.3" + minipass-collect "^1.0.2" + minipass-fetch "^1.3.2" + minipass-flush "^1.0.5" + minipass-pipeline "^1.2.4" + negotiator "^0.6.2" + promise-retry "^2.0.1" + socks-proxy-agent "^6.0.0" + ssri "^8.0.0" + +makeerror@1.0.12: + version "1.0.12" + resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.12.tgz#3e5dd2079a82e812e983cc6610c4a2cb0eaa801a" + integrity sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg== + dependencies: + tmpl "1.0.5" + +map-obj@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" + integrity sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg== + +map-obj@^4.0.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-4.3.0.tgz#9304f906e93faae70880da102a9f1df0ea8bb05a" + integrity sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ== + +marked@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/marked/-/marked-4.3.0.tgz#796362821b019f734054582038b116481b456cf3" + integrity sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A== + +mcl-wasm@^0.7.1: + version "0.7.9" + resolved "https://registry.yarnpkg.com/mcl-wasm/-/mcl-wasm-0.7.9.tgz#c1588ce90042a8700c3b60e40efb339fc07ab87f" + integrity sha512-iJIUcQWA88IJB/5L15GnJVnSQJmf/YaxxV6zRavv83HILHaJQb6y0iFyDMdDO0gN8X37tdxmAOrH/P8B6RB8sQ== + +md5.js@^1.3.4: + version "1.3.5" + resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f" + integrity sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg== + dependencies: + hash-base "^3.0.0" + inherits "^2.0.1" + safe-buffer "^5.1.2" + +memory-level@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/memory-level/-/memory-level-1.0.0.tgz#7323c3fd368f9af2f71c3cd76ba403a17ac41692" + integrity sha512-UXzwewuWeHBz5krr7EvehKcmLFNoXxGcvuYhC41tRnkrTbJohtS7kVn9akmgirtRygg+f7Yjsfi8Uu5SGSQ4Og== + dependencies: + abstract-level "^1.0.0" + functional-red-black-tree "^1.0.1" + module-error "^1.0.1" + +memorystream@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/memorystream/-/memorystream-0.3.1.tgz#86d7090b30ce455d63fbae12dda51a47ddcaf9b2" + integrity sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw== + +meow@^8.1.2: + version "8.1.2" + resolved "https://registry.yarnpkg.com/meow/-/meow-8.1.2.tgz#bcbe45bda0ee1729d350c03cffc8395a36c4e897" + integrity sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q== + dependencies: + "@types/minimist" "^1.2.0" + camelcase-keys "^6.2.2" + decamelize-keys "^1.1.0" + hard-rejection "^2.1.0" + minimist-options "4.1.0" + normalize-package-data "^3.0.0" + read-pkg-up "^7.0.1" + redent "^3.0.0" + trim-newlines "^3.0.0" + type-fest "^0.18.0" + yargs-parser "^20.2.3" + +merge-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" + integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== + +merge2@^1.3.0, merge2@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" + integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== + +merge@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/merge/-/merge-2.1.1.tgz#59ef4bf7e0b3e879186436e8481c06a6c162ca98" + integrity sha512-jz+Cfrg9GWOZbQAnDQ4hlVnQky+341Yk5ru8bZSe6sIDTCIg8n9i/u7hSQGSVOF3C7lH6mGtqjkiT9G4wFLL0w== + +merkletreejs@^0.3.11: + version "0.3.11" + resolved "https://registry.yarnpkg.com/merkletreejs/-/merkletreejs-0.3.11.tgz#e0de05c3ca1fd368de05a12cb8efb954ef6fc04f" + integrity sha512-LJKTl4iVNTndhL+3Uz/tfkjD0klIWsHlUzgtuNnNrsf7bAlXR30m+xYB7lHr5Z/l6e/yAIsr26Dabx6Buo4VGQ== + dependencies: + bignumber.js "^9.0.1" + buffer-reverse "^1.0.1" + crypto-js "^4.2.0" + treeify "^1.1.0" + web3-utils "^1.3.4" + +micro-ftch@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/micro-ftch/-/micro-ftch-0.3.1.tgz#6cb83388de4c1f279a034fb0cf96dfc050853c5f" + integrity sha512-/0LLxhzP0tfiR5hcQebtudP56gUurs2CLkGarnCiB/OqEyUFQ6U3paQi/tgLv0hBJYt2rnr9MNpxz4fiiugstg== + +micromatch@^4.0.2, micromatch@^4.0.4: + version "4.0.5" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" + integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== + dependencies: + braces "^3.0.2" + picomatch "^2.3.1" + +mime-db@1.52.0: + version "1.52.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" + integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== + +mime-types@^2.1.12: + version "2.1.35" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" + integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== + dependencies: + mime-db "1.52.0" + +mimic-fn@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" + integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== + +min-indent@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/min-indent/-/min-indent-1.0.1.tgz#a63f681673b30571fbe8bc25686ae746eefa9869" + integrity sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg== + +minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" + integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== + +minimalistic-crypto-utils@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" + integrity sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg== + +minimatch@3.0.5: + version "3.0.5" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.5.tgz#4da8f1290ee0f0f8e83d60ca69f8f134068604a3" + integrity sha512-tUpxzX0VAzJHjLu0xUfFv1gwVp9ba3IOuRAVH2EGuRW8a5emA2FlACLqiT/lDVtS1W+TGNwqz3sWaNyLgDJWuw== + dependencies: + brace-expansion "^1.1.7" + +minimatch@5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.0.1.tgz#fb9022f7528125187c92bd9e9b6366be1cf3415b" + integrity sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g== + dependencies: + brace-expansion "^2.0.1" + +minimatch@9.0.3, minimatch@^9.0.0, minimatch@^9.0.1, minimatch@^9.0.3: + version "9.0.3" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.3.tgz#a6e00c3de44c3a542bfaae70abfc22420a6da825" + integrity sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg== + dependencies: + brace-expansion "^2.0.1" + +minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== + dependencies: + brace-expansion "^1.1.7" + +minimatch@^5.0.1: + version "5.1.6" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.1.6.tgz#1cfcb8cf5522ea69952cd2af95ae09477f122a96" + integrity sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g== + dependencies: + brace-expansion "^2.0.1" + +minimatch@^8.0.2: + version "8.0.4" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-8.0.4.tgz#847c1b25c014d4e9a7f68aaf63dedd668a626229" + integrity sha512-W0Wvr9HyFXZRGIDgCicunpQ299OKXs9RgZfaukz4qAW/pJhcpUfupc9c+OObPOFueNy8VSrZgEmDtk6Kh4WzDA== + dependencies: + brace-expansion "^2.0.1" + +minimist-options@4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/minimist-options/-/minimist-options-4.1.0.tgz#c0655713c53a8a2ebd77ffa247d342c40f010619" + integrity sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A== + dependencies: + arrify "^1.0.1" + is-plain-obj "^1.1.0" + kind-of "^6.0.3" + +minimist@^1.2.0, minimist@^1.2.5, minimist@^1.2.6: + version "1.2.8" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" + integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== + +minipass-collect@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/minipass-collect/-/minipass-collect-1.0.2.tgz#22b813bf745dc6edba2576b940022ad6edc8c617" + integrity sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA== + dependencies: + minipass "^3.0.0" + +minipass-fetch@^1.3.2: + version "1.4.1" + resolved "https://registry.yarnpkg.com/minipass-fetch/-/minipass-fetch-1.4.1.tgz#d75e0091daac1b0ffd7e9d41629faff7d0c1f1b6" + integrity sha512-CGH1eblLq26Y15+Azk7ey4xh0J/XfJfrCox5LDJiKqI2Q2iwOLOKrlmIaODiSQS8d18jalF6y2K2ePUm0CmShw== + dependencies: + minipass "^3.1.0" + minipass-sized "^1.0.3" + minizlib "^2.0.0" + optionalDependencies: + encoding "^0.1.12" + +minipass-fetch@^2.0.3: + version "2.1.2" + resolved "https://registry.yarnpkg.com/minipass-fetch/-/minipass-fetch-2.1.2.tgz#95560b50c472d81a3bc76f20ede80eaed76d8add" + integrity sha512-LT49Zi2/WMROHYoqGgdlQIZh8mLPZmOrN2NdJjMXxYe4nkN6FUyuPuOAOedNJDrx0IRGg9+4guZewtp8hE6TxA== + dependencies: + minipass "^3.1.6" + minipass-sized "^1.0.3" + minizlib "^2.1.2" + optionalDependencies: + encoding "^0.1.13" + +minipass-fetch@^3.0.0: + version "3.0.4" + resolved "https://registry.yarnpkg.com/minipass-fetch/-/minipass-fetch-3.0.4.tgz#4d4d9b9f34053af6c6e597a64be8e66e42bf45b7" + integrity sha512-jHAqnA728uUpIaFm7NWsCnqKT6UqZz7GcI/bDpPATuwYyKwJwW0remxSCxUlKiEty+eopHGa3oc8WxgQ1FFJqg== + dependencies: + minipass "^7.0.3" + minipass-sized "^1.0.3" + minizlib "^2.1.2" + optionalDependencies: + encoding "^0.1.13" + +minipass-flush@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/minipass-flush/-/minipass-flush-1.0.5.tgz#82e7135d7e89a50ffe64610a787953c4c4cbb373" + integrity sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw== + dependencies: + minipass "^3.0.0" + +minipass-json-stream@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minipass-json-stream/-/minipass-json-stream-1.0.1.tgz#7edbb92588fbfc2ff1db2fc10397acb7b6b44aa7" + integrity sha512-ODqY18UZt/I8k+b7rl2AENgbWE8IDYam+undIJONvigAz8KR5GWblsFTEfQs0WODsjbSXWlm+JHEv8Gr6Tfdbg== + dependencies: + jsonparse "^1.3.1" + minipass "^3.0.0" + +minipass-pipeline@^1.2.2, minipass-pipeline@^1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz#68472f79711c084657c067c5c6ad93cddea8214c" + integrity sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A== + dependencies: + minipass "^3.0.0" + +minipass-sized@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/minipass-sized/-/minipass-sized-1.0.3.tgz#70ee5a7c5052070afacfbc22977ea79def353b70" + integrity sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g== + dependencies: + minipass "^3.0.0" + +minipass@^3.0.0, minipass@^3.1.0, minipass@^3.1.1, minipass@^3.1.3, minipass@^3.1.6: + version "3.3.6" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.3.6.tgz#7bba384db3a1520d18c9c0e5251c3444e95dd94a" + integrity sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw== + dependencies: + yallist "^4.0.0" + +minipass@^4.2.4: + version "4.2.8" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-4.2.8.tgz#f0010f64393ecfc1d1ccb5f582bcaf45f48e1a3a" + integrity sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ== + +minipass@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-5.0.0.tgz#3e9788ffb90b694a5d0ec94479a45b5d8738133d" + integrity sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ== + +"minipass@^5.0.0 || ^6.0.2 || ^7.0.0", minipass@^7.0.3: + version "7.0.4" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.0.4.tgz#dbce03740f50a4786ba994c1fb908844d27b038c" + integrity sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ== + +minizlib@^2.0.0, minizlib@^2.1.1, minizlib@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-2.1.2.tgz#e90d3466ba209b932451508a11ce3d3632145931" + integrity sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg== + dependencies: + minipass "^3.0.0" + yallist "^4.0.0" + +mkdirp@1.0.4, mkdirp@^1.0.3, mkdirp@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" + integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== + +mnemonist@^0.38.0: + version "0.38.5" + resolved "https://registry.yarnpkg.com/mnemonist/-/mnemonist-0.38.5.tgz#4adc7f4200491237fe0fa689ac0b86539685cade" + integrity sha512-bZTFT5rrPKtPJxj8KSV0WkPyNxl72vQepqqVUAW2ARUpUSF2qXMB6jZj7hW5/k7C1rtpzqbD/IIbJwLXUjCHeg== + dependencies: + obliterator "^2.0.0" + +mocha@^10.0.0: + version "10.3.0" + resolved "https://registry.yarnpkg.com/mocha/-/mocha-10.3.0.tgz#0e185c49e6dccf582035c05fa91084a4ff6e3fe9" + integrity sha512-uF2XJs+7xSLsrmIvn37i/wnc91nw7XjOQB8ccyx5aEgdnohr7n+rEiZP23WkCYHjilR6+EboEnbq/ZQDz4LSbg== + dependencies: + ansi-colors "4.1.1" + browser-stdout "1.3.1" + chokidar "3.5.3" + debug "4.3.4" + diff "5.0.0" + escape-string-regexp "4.0.0" + find-up "5.0.0" + glob "8.1.0" + he "1.2.0" + js-yaml "4.1.0" + log-symbols "4.1.0" + minimatch "5.0.1" + ms "2.1.3" + serialize-javascript "6.0.0" + strip-json-comments "3.1.1" + supports-color "8.1.1" + workerpool "6.2.1" + yargs "16.2.0" + yargs-parser "20.2.4" + yargs-unparser "2.0.0" + +modify-values@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/modify-values/-/modify-values-1.0.1.tgz#b3939fa605546474e3e3e3c63d64bd43b4ee6022" + integrity sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw== + +module-error@^1.0.1, module-error@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/module-error/-/module-error-1.0.2.tgz#8d1a48897ca883f47a45816d4fb3e3c6ba404d86" + integrity sha512-0yuvsqSCv8LbaOKhnsQ/T5JhyFlCYLPXK3U2sgV10zoKQwzs/MyfuQUOZQ1V/6OCOJsK/TRgNVrPuPDqtdMFtA== + +mri@1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/mri/-/mri-1.1.4.tgz#7cb1dd1b9b40905f1fac053abe25b6720f44744a" + integrity sha512-6y7IjGPm8AzlvoUrwAaw1tLnUBudaS3752vcd8JtrpGGQn+rXIe63LFVHm/YMwtqAuh+LJPCFdlLYPWM1nYn6w== + +ms@2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + +ms@2.1.3, ms@^2.0.0, ms@^2.1.1: + version "2.1.3" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + +multimatch@5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/multimatch/-/multimatch-5.0.0.tgz#932b800963cea7a31a033328fa1e0c3a1874dbe6" + integrity sha512-ypMKuglUrZUD99Tk2bUQ+xNQj43lPEfAeX2o9cTteAmShXy2VHDJpuwu1o0xqoKCt9jLVAvwyFKdLTPXKAfJyA== + dependencies: + "@types/minimatch" "^3.0.3" + array-differ "^3.0.0" + array-union "^2.1.0" + arrify "^2.0.1" + minimatch "^3.0.4" + +mute-stream@0.0.8: + version "0.0.8" + resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" + integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== + +mute-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-1.0.0.tgz#e31bd9fe62f0aed23520aa4324ea6671531e013e" + integrity sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA== + +mz@^2.4.0: + version "2.7.0" + resolved "https://registry.yarnpkg.com/mz/-/mz-2.7.0.tgz#95008057a56cafadc2bc63dde7f9ff6955948e32" + integrity sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q== + dependencies: + any-promise "^1.0.0" + object-assign "^4.0.1" + thenify-all "^1.0.0" + +napi-macros@^2.2.2: + version "2.2.2" + resolved "https://registry.yarnpkg.com/napi-macros/-/napi-macros-2.2.2.tgz#817fef20c3e0e40a963fbf7b37d1600bd0201044" + integrity sha512-hmEVtAGYzVQpCKdbQea4skABsdXW4RUh5t5mJ2zzqowJS2OyXZTU1KhDVFhx+NlWZ4ap9mqR9TcDO3LTTttd+g== + +napi-macros@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/napi-macros/-/napi-macros-2.0.0.tgz#2b6bae421e7b96eb687aa6c77a7858640670001b" + integrity sha512-A0xLykHtARfueITVDernsAWdtIMbOJgKgcluwENp3AlsKN/PloyO10HtmoqnFAQAcxPkgZN7wdfPfEd0zNGxbg== + +natural-compare@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" + integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== + +negotiator@^0.6.2, negotiator@^0.6.3: + version "0.6.3" + resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" + integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== + +neo-async@^2.6.2: + version "2.6.2" + resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" + integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== + +nock@^13.2.9: + version "13.5.1" + resolved "https://registry.yarnpkg.com/nock/-/nock-13.5.1.tgz#4e40f9877ad0d43b7cdb474261c190f3715dd806" + integrity sha512-+s7b73fzj5KnxbKH4Oaqz07tQ8degcMilU4rrmnKvI//b0JMBU4wEXFQ8zqr+3+L4eWSfU3H/UoIVGUV0tue1Q== + dependencies: + debug "^4.1.0" + json-stringify-safe "^5.0.1" + propagate "^2.0.0" + +node-addon-api@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-2.0.2.tgz#432cfa82962ce494b132e9d72a15b29f71ff5d32" + integrity sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA== + +node-addon-api@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-3.2.1.tgz#81325e0a2117789c0128dab65e7e38f07ceba161" + integrity sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A== + +node-fetch@2.6.7: + version "2.6.7" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.7.tgz#24de9fba827e3b4ae44dc8b20256a379160052ad" + integrity sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ== + dependencies: + whatwg-url "^5.0.0" + +node-fetch@^2.6.7: + version "2.7.0" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.7.0.tgz#d0f0fa6e3e2dc1d27efcd8ad99d550bda94d187d" + integrity sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A== + dependencies: + whatwg-url "^5.0.0" + +node-gyp-build@4.4.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.4.0.tgz#42e99687ce87ddeaf3a10b99dc06abc11021f3f4" + integrity sha512-amJnQCcgtRVw9SvoebO3BKGESClrfXGCUTX9hSn1OuGQTQBOZmVd0Z0OlecpuRksKvbsUqALE8jls/ErClAPuQ== + +node-gyp-build@^4.2.0, node-gyp-build@^4.3.0: + version "4.8.0" + resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.8.0.tgz#3fee9c1731df4581a3f9ead74664369ff00d26dd" + integrity sha512-u6fs2AEUljNho3EYTJNBfImO5QTo/J/1Etd+NVdCj7qWKUSN/bSLkZwhDv7I+w/MSC6qJ4cknepkAYykDdK8og== + +node-gyp@^9.0.0, node-gyp@^9.4.0: + version "9.4.1" + resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-9.4.1.tgz#8a1023e0d6766ecb52764cc3a734b36ff275e185" + integrity sha512-OQkWKbjQKbGkMf/xqI1jjy3oCTgMKJac58G2+bjZb3fza6gW2YrCSdMQYaoTb70crvE//Gngr4f0AgVHmqHvBQ== + dependencies: + env-paths "^2.2.0" + exponential-backoff "^3.1.1" + glob "^7.1.4" + graceful-fs "^4.2.6" + make-fetch-happen "^10.0.3" + nopt "^6.0.0" + npmlog "^6.0.0" + rimraf "^3.0.2" + semver "^7.3.5" + tar "^6.1.2" + which "^2.0.2" + +node-int64@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" + integrity sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw== + +node-machine-id@1.1.12: + version "1.1.12" + resolved "https://registry.yarnpkg.com/node-machine-id/-/node-machine-id-1.1.12.tgz#37904eee1e59b320bb9c5d6c0a59f3b469cb6267" + integrity sha512-QNABxbrPa3qEIfrE6GOJ7BYIuignnJw7iQ2YPbc3Nla1HzRJjXzZOiikfF8m7eAMfichLt3M4VgLOetqgDmgGQ== + +node-releases@^2.0.14: + version "2.0.14" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.14.tgz#2ffb053bceb8b2be8495ece1ab6ce600c4461b0b" + integrity sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw== + +nopt@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-6.0.0.tgz#245801d8ebf409c6df22ab9d95b65e1309cdb16d" + integrity sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g== + dependencies: + abbrev "^1.0.0" + +normalize-package-data@^2.3.2, normalize-package-data@^2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" + integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== + dependencies: + hosted-git-info "^2.1.4" + resolve "^1.10.0" + semver "2 || 3 || 4 || 5" + validate-npm-package-license "^3.0.1" + +normalize-package-data@^3.0.0, normalize-package-data@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-3.0.3.tgz#dbcc3e2da59509a0983422884cd172eefdfa525e" + integrity sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA== + dependencies: + hosted-git-info "^4.0.1" + is-core-module "^2.5.0" + semver "^7.3.4" + validate-npm-package-license "^3.0.1" + +normalize-package-data@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-5.0.0.tgz#abcb8d7e724c40d88462b84982f7cbf6859b4588" + integrity sha512-h9iPVIfrVZ9wVYQnxFgtw1ugSvGEMOlyPWWtm8BMJhnwyEL/FLbYbTY3V3PpjI/BUK67n9PEWDu6eHzu1fB15Q== + dependencies: + hosted-git-info "^6.0.0" + is-core-module "^2.8.1" + semver "^7.3.5" + validate-npm-package-license "^3.0.4" + +normalize-path@^3.0.0, normalize-path@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + +npm-bundled@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.1.2.tgz#944c78789bd739035b70baa2ca5cc32b8d860bc1" + integrity sha512-x5DHup0SuyQcmL3s7Rx/YQ8sbw/Hzg0rj48eN0dV7hf5cmQq5PXIeioroH3raV1QC1yh3uTYuMThvEQF3iKgGQ== + dependencies: + npm-normalize-package-bin "^1.0.1" + +npm-bundled@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-3.0.0.tgz#7e8e2f8bb26b794265028491be60321a25a39db7" + integrity sha512-Vq0eyEQy+elFpzsKjMss9kxqb9tG3YHg4dsyWuUENuzvSUWe1TCnW/vV9FkhvBk/brEDoDiVd+M1Btosa6ImdQ== + dependencies: + npm-normalize-package-bin "^3.0.0" + +npm-dts@^1.3.12: + version "1.3.12" + resolved "https://registry.yarnpkg.com/npm-dts/-/npm-dts-1.3.12.tgz#e422b1188fb616f41fe5c566c3d636c1aafb2ed8" + integrity sha512-3pFsz7Gf1u0cyQE2czXt8Y0hKe6kczHxlFbVrr74xWweNUit2tCDbOcL4n6KaWxyimGNJ4gzOa8KkShFA8hrdA== + dependencies: + args "5.0.3" + find-node-modules "2.1.3" + mkdirp "1.0.4" + npm-run "5.0.1" + rimraf "3.0.2" + tmp "0.2.1" + winston "3.7.2" + +npm-install-checks@^6.0.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/npm-install-checks/-/npm-install-checks-6.3.0.tgz#046552d8920e801fa9f919cad569545d60e826fe" + integrity sha512-W29RiK/xtpCGqn6f3ixfRYGk+zRyr+Ew9F2E20BfXxT5/euLdA/Nm7fO7OeTGuAmTs30cpgInyJ0cYe708YTZw== + dependencies: + semver "^7.1.1" + +npm-normalize-package-bin@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz#6e79a41f23fd235c0623218228da7d9c23b8f6e2" + integrity sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA== + +npm-normalize-package-bin@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/npm-normalize-package-bin/-/npm-normalize-package-bin-3.0.1.tgz#25447e32a9a7de1f51362c61a559233b89947832" + integrity sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ== + +npm-package-arg@8.1.1: + version "8.1.1" + resolved "https://registry.yarnpkg.com/npm-package-arg/-/npm-package-arg-8.1.1.tgz#00ebf16ac395c63318e67ce66780a06db6df1b04" + integrity sha512-CsP95FhWQDwNqiYS+Q0mZ7FAEDytDZAkNxQqea6IaAFJTAY9Lhhqyl0irU/6PMc7BGfUmnsbHcqxJD7XuVM/rg== + dependencies: + hosted-git-info "^3.0.6" + semver "^7.0.0" + validate-npm-package-name "^3.0.0" + +npm-package-arg@^10.0.0, npm-package-arg@^10.1.0: + version "10.1.0" + resolved "https://registry.yarnpkg.com/npm-package-arg/-/npm-package-arg-10.1.0.tgz#827d1260a683806685d17193073cc152d3c7e9b1" + integrity sha512-uFyyCEmgBfZTtrKk/5xDfHp6+MdrqGotX/VoOyEEl3mBwiEE5FlBaePanazJSVMPT7vKepcjYBY2ztg9A3yPIA== + dependencies: + hosted-git-info "^6.0.0" + proc-log "^3.0.0" + semver "^7.3.5" + validate-npm-package-name "^5.0.0" + +npm-packlist@5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-5.1.1.tgz#79bcaf22a26b6c30aa4dd66b976d69cc286800e0" + integrity sha512-UfpSvQ5YKwctmodvPPkK6Fwk603aoVsf8AEbmVKAEECrfvL8SSe1A2YIwrJ6xmTHAITKPwwZsWo7WwEbNk0kxw== + dependencies: + glob "^8.0.1" + ignore-walk "^5.0.1" + npm-bundled "^1.1.2" + npm-normalize-package-bin "^1.0.1" + +npm-packlist@^7.0.0: + version "7.0.4" + resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-7.0.4.tgz#033bf74110eb74daf2910dc75144411999c5ff32" + integrity sha512-d6RGEuRrNS5/N84iglPivjaJPxhDbZmlbTwTDX2IbcRHG5bZCdtysYMhwiPvcF4GisXHGn7xsxv+GQ7T/02M5Q== + dependencies: + ignore-walk "^6.0.0" + +npm-path@^2.0.2, npm-path@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/npm-path/-/npm-path-2.0.4.tgz#c641347a5ff9d6a09e4d9bce5580c4f505278e64" + integrity sha512-IFsj0R9C7ZdR5cP+ET342q77uSRdtWOlWpih5eC+lu29tIDbNEgDbzgVJ5UFvYHWhxDZ5TFkJafFioO0pPQjCw== + dependencies: + which "^1.2.10" + +npm-pick-manifest@^8.0.0: + version "8.0.2" + resolved "https://registry.yarnpkg.com/npm-pick-manifest/-/npm-pick-manifest-8.0.2.tgz#2159778d9c7360420c925c1a2287b5a884c713aa" + integrity sha512-1dKY+86/AIiq1tkKVD3l0WI+Gd3vkknVGAggsFeBkTvbhMQ1OND/LKkYv4JtXPKUJ8bOTCyLiqEg2P6QNdK+Gg== + dependencies: + npm-install-checks "^6.0.0" + npm-normalize-package-bin "^3.0.0" + npm-package-arg "^10.0.0" + semver "^7.3.5" + +npm-registry-fetch@^14.0.0, npm-registry-fetch@^14.0.3, npm-registry-fetch@^14.0.5: + version "14.0.5" + resolved "https://registry.yarnpkg.com/npm-registry-fetch/-/npm-registry-fetch-14.0.5.tgz#fe7169957ba4986a4853a650278ee02e568d115d" + integrity sha512-kIDMIo4aBm6xg7jOttupWZamsZRkAqMqwqqbVXnUqstY5+tapvv6bkH/qMR76jdgV+YljEUCyWx3hRYMrJiAgA== + dependencies: + make-fetch-happen "^11.0.0" + minipass "^5.0.0" + minipass-fetch "^3.0.0" + minipass-json-stream "^1.0.1" + minizlib "^2.1.2" + npm-package-arg "^10.0.0" + proc-log "^3.0.0" + +npm-run-path@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" + integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== + dependencies: + path-key "^3.0.0" + +npm-run@5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/npm-run/-/npm-run-5.0.1.tgz#1baea93389b50ae25a32382c8ca322398e50cd16" + integrity sha512-s7FyRpHUgaJfzkRgOnevX8rAWWsv1dofY1XS7hliWCF6LSQh+HtDfBvpigPS1krLvXw+Fi17CYMY8mUtblnyWw== + dependencies: + minimist "^1.2.0" + npm-path "^2.0.4" + npm-which "^3.0.1" + serializerr "^1.0.3" + +npm-which@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/npm-which/-/npm-which-3.0.1.tgz#9225f26ec3a285c209cae67c3b11a6b4ab7140aa" + integrity sha512-CM8vMpeFQ7MAPin0U3wzDhSGV0hMHNwHU0wjo402IVizPDrs45jSfSuoC+wThevY88LQti8VvaAnqYAeVy3I1A== + dependencies: + commander "^2.9.0" + npm-path "^2.0.2" + which "^1.2.10" + +npmlog@^6.0.0, npmlog@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-6.0.2.tgz#c8166017a42f2dea92d6453168dd865186a70830" + integrity sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg== + dependencies: + are-we-there-yet "^3.0.0" + console-control-strings "^1.1.0" + gauge "^4.0.3" + set-blocking "^2.0.0" + +number-to-bn@1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/number-to-bn/-/number-to-bn-1.7.0.tgz#bb3623592f7e5f9e0030b1977bd41a0c53fe1ea0" + integrity sha512-wsJ9gfSz1/s4ZsJN01lyonwuxA1tml6X1yBDnfpMglypcBRFZZkus26EdPSlqS5GJfYddVZa22p3VNb3z5m5Ig== + dependencies: + bn.js "4.11.6" + strip-hex-prefix "1.0.0" + +nx@16.10.0, "nx@>=16.5.1 < 17", nx@^16.8.1: + version "16.10.0" + resolved "https://registry.yarnpkg.com/nx/-/nx-16.10.0.tgz#b070461f7de0a3d7988bd78558ea84cda3543ace" + integrity sha512-gZl4iCC0Hx0Qe1VWmO4Bkeul2nttuXdPpfnlcDKSACGu3ZIo+uySqwOF8yBAxSTIf8xe2JRhgzJN1aFkuezEBg== + dependencies: + "@nrwl/tao" "16.10.0" + "@parcel/watcher" "2.0.4" + "@yarnpkg/lockfile" "^1.1.0" + "@yarnpkg/parsers" "3.0.0-rc.46" + "@zkochan/js-yaml" "0.0.6" + axios "^1.0.0" + chalk "^4.1.0" + cli-cursor "3.1.0" + cli-spinners "2.6.1" + cliui "^8.0.1" + dotenv "~16.3.1" + dotenv-expand "~10.0.0" + enquirer "~2.3.6" + figures "3.2.0" + flat "^5.0.2" + fs-extra "^11.1.0" + glob "7.1.4" + ignore "^5.0.4" + jest-diff "^29.4.1" + js-yaml "4.1.0" + jsonc-parser "3.2.0" + lines-and-columns "~2.0.3" + minimatch "3.0.5" + node-machine-id "1.1.12" + npm-run-path "^4.0.1" + open "^8.4.0" + semver "7.5.3" + string-width "^4.2.3" + strong-log-transformer "^2.1.0" + tar-stream "~2.2.0" + tmp "~0.2.1" + tsconfig-paths "^4.1.2" + tslib "^2.3.0" + v8-compile-cache "2.3.0" + yargs "^17.6.2" + yargs-parser "21.1.1" + optionalDependencies: + "@nx/nx-darwin-arm64" "16.10.0" + "@nx/nx-darwin-x64" "16.10.0" + "@nx/nx-freebsd-x64" "16.10.0" + "@nx/nx-linux-arm-gnueabihf" "16.10.0" + "@nx/nx-linux-arm64-gnu" "16.10.0" + "@nx/nx-linux-arm64-musl" "16.10.0" + "@nx/nx-linux-x64-gnu" "16.10.0" + "@nx/nx-linux-x64-musl" "16.10.0" + "@nx/nx-win32-arm64-msvc" "16.10.0" + "@nx/nx-win32-x64-msvc" "16.10.0" + +object-assign@^4.0.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== + +object-inspect@^1.13.1: + version "1.13.1" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.1.tgz#b96c6109324ccfef6b12216a956ca4dc2ff94bc2" + integrity sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ== + +object-keys@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" + integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== + +object.assign@^4.1.2, object.assign@^4.1.4: + version "4.1.5" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.5.tgz#3a833f9ab7fdb80fc9e8d2300c803d216d8fdbb0" + integrity sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ== + dependencies: + call-bind "^1.0.5" + define-properties "^1.2.1" + has-symbols "^1.0.3" + object-keys "^1.1.1" + +object.entries@^1.1.5: + version "1.1.7" + resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.7.tgz#2b47760e2a2e3a752f39dd874655c61a7f03c131" + integrity sha512-jCBs/0plmPsOnrKAfFQXRG2NFjlhZgjjcBLSmTnEhU8U6vVTsVe8ANeQJCHTl3gSsI4J+0emOoCgoKlmQPMgmA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + +object.fromentries@^2.0.7: + version "2.0.7" + resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.7.tgz#71e95f441e9a0ea6baf682ecaaf37fa2a8d7e616" + integrity sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + +object.groupby@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/object.groupby/-/object.groupby-1.0.2.tgz#494800ff5bab78fd0eff2835ec859066e00192ec" + integrity sha512-bzBq58S+x+uo0VjurFT0UktpKHOZmv4/xePiOA1nbB9pMqpGK7rUPNgf+1YC+7mE+0HzhTMqNUuCqvKhj6FnBw== + dependencies: + array.prototype.filter "^1.0.3" + call-bind "^1.0.5" + define-properties "^1.2.1" + es-abstract "^1.22.3" + es-errors "^1.0.0" + +object.values@^1.1.7: + version "1.1.7" + resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.7.tgz#617ed13272e7e1071b43973aa1655d9291b8442a" + integrity sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + +obliterator@^2.0.0: + version "2.0.4" + resolved "https://registry.yarnpkg.com/obliterator/-/obliterator-2.0.4.tgz#fa650e019b2d075d745e44f1effeb13a2adbe816" + integrity sha512-lgHwxlxV1qIg1Eap7LgIeoBWIMFibOjbrYPIPJZcI1mmGAI2m3lNYpK12Y+GBdPQ0U1hRwSord7GIaawz962qQ== + +once@^1.3.0, once@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== + dependencies: + wrappy "1" + +one-time@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/one-time/-/one-time-1.0.0.tgz#e06bc174aed214ed58edede573b433bbf827cb45" + integrity sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g== + dependencies: + fn.name "1.x.x" + +onetime@^5.1.0, onetime@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" + integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== + dependencies: + mimic-fn "^2.1.0" + +open@^8.4.0: + version "8.4.2" + resolved "https://registry.yarnpkg.com/open/-/open-8.4.2.tgz#5b5ffe2a8f793dcd2aad73e550cb87b59cb084f9" + integrity sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ== + dependencies: + define-lazy-prop "^2.0.0" + is-docker "^2.1.1" + is-wsl "^2.2.0" + +optionator@^0.9.3: + version "0.9.3" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.3.tgz#007397d44ed1872fdc6ed31360190f81814e2c64" + integrity sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg== + dependencies: + "@aashutoshrathi/word-wrap" "^1.2.3" + deep-is "^0.1.3" + fast-levenshtein "^2.0.6" + levn "^0.4.1" + prelude-ls "^1.2.1" + type-check "^0.4.0" + +ora@^5.4.1: + version "5.4.1" + resolved "https://registry.yarnpkg.com/ora/-/ora-5.4.1.tgz#1b2678426af4ac4a509008e5e4ac9e9959db9e18" + integrity sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ== + dependencies: + bl "^4.1.0" + chalk "^4.1.0" + cli-cursor "^3.1.0" + cli-spinners "^2.5.0" + is-interactive "^1.0.0" + is-unicode-supported "^0.1.0" + log-symbols "^4.1.0" + strip-ansi "^6.0.0" + wcwidth "^1.0.1" + +os-tmpdir@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" + integrity sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g== + +p-finally@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" + integrity sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow== + +p-limit@^1.1.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" + integrity sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q== + dependencies: + p-try "^1.0.0" + +p-limit@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" + integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== + dependencies: + p-try "^2.0.0" + +p-limit@^3.0.2, p-limit@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" + integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== + dependencies: + yocto-queue "^0.1.0" + +p-locate@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" + integrity sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg== + dependencies: + p-limit "^1.1.0" + +p-locate@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" + integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== + dependencies: + p-limit "^2.2.0" + +p-locate@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" + integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== + dependencies: + p-limit "^3.0.2" + +p-map-series@2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/p-map-series/-/p-map-series-2.1.0.tgz#7560d4c452d9da0c07e692fdbfe6e2c81a2a91f2" + integrity sha512-RpYIIK1zXSNEOdwxcfe7FdvGcs7+y5n8rifMhMNWvaxRNMPINJHF5GDeuVxWqnfrcHPSCnp7Oo5yNXHId9Av2Q== + +p-map@4.0.0, p-map@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/p-map/-/p-map-4.0.0.tgz#bb2f95a5eda2ec168ec9274e06a747c3e2904d2b" + integrity sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ== + dependencies: + aggregate-error "^3.0.0" + +p-map@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/p-map/-/p-map-3.0.0.tgz#d704d9af8a2ba684e2600d9a215983d4141a979d" + integrity sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ== + dependencies: + aggregate-error "^3.0.0" + +p-pipe@3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/p-pipe/-/p-pipe-3.1.0.tgz#48b57c922aa2e1af6a6404cb7c6bf0eb9cc8e60e" + integrity sha512-08pj8ATpzMR0Y80x50yJHn37NF6vjrqHutASaX5LiH5npS9XPvrUmscd9MF5R4fuYRHOxQR1FfMIlF7AzwoPqw== + +p-queue@6.6.2: + version "6.6.2" + resolved "https://registry.yarnpkg.com/p-queue/-/p-queue-6.6.2.tgz#2068a9dcf8e67dd0ec3e7a2bcb76810faa85e426" + integrity sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ== + dependencies: + eventemitter3 "^4.0.4" + p-timeout "^3.2.0" + +p-reduce@2.1.0, p-reduce@^2.0.0, p-reduce@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/p-reduce/-/p-reduce-2.1.0.tgz#09408da49507c6c274faa31f28df334bc712b64a" + integrity sha512-2USApvnsutq8uoxZBGbbWM0JIYLiEMJ9RlaN7fAzVNb9OZN0SHjjTTfIcb667XynS5Y1VhwDJVDa72TnPzAYWw== + +p-timeout@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/p-timeout/-/p-timeout-3.2.0.tgz#c7e17abc971d2a7962ef83626b35d635acf23dfe" + integrity sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg== + dependencies: + p-finally "^1.0.0" + +p-try@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" + integrity sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww== + +p-try@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" + integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== + +p-waterfall@2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/p-waterfall/-/p-waterfall-2.1.1.tgz#63153a774f472ccdc4eb281cdb2967fcf158b2ee" + integrity sha512-RRTnDb2TBG/epPRI2yYXsimO0v3BXC8Yd3ogr1545IaqKK17VGhbWVeGGN+XfCm/08OK8635nH31c8bATkHuSw== + dependencies: + p-reduce "^2.0.0" + +pacote@^15.2.0: + version "15.2.0" + resolved "https://registry.yarnpkg.com/pacote/-/pacote-15.2.0.tgz#0f0dfcc3e60c7b39121b2ac612bf8596e95344d3" + integrity sha512-rJVZeIwHTUta23sIZgEIM62WYwbmGbThdbnkt81ravBplQv+HjyroqnLRNH2+sLJHcGZmLRmhPwACqhfTcOmnA== + dependencies: + "@npmcli/git" "^4.0.0" + "@npmcli/installed-package-contents" "^2.0.1" + "@npmcli/promise-spawn" "^6.0.1" + "@npmcli/run-script" "^6.0.0" + cacache "^17.0.0" + fs-minipass "^3.0.0" + minipass "^5.0.0" + npm-package-arg "^10.0.0" + npm-packlist "^7.0.0" + npm-pick-manifest "^8.0.0" + npm-registry-fetch "^14.0.0" + proc-log "^3.0.0" + promise-retry "^2.0.1" + read-package-json "^6.0.0" + read-package-json-fast "^3.0.0" + sigstore "^1.3.0" + ssri "^10.0.0" + tar "^6.1.11" + +parent-module@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" + integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== + dependencies: + callsites "^3.0.0" + +parse-json@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" + integrity sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw== + dependencies: + error-ex "^1.3.1" + json-parse-better-errors "^1.0.1" + +parse-json@^5.0.0, parse-json@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" + integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== + dependencies: + "@babel/code-frame" "^7.0.0" + error-ex "^1.3.1" + json-parse-even-better-errors "^2.3.0" + lines-and-columns "^1.1.6" + +parse-passwd@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/parse-passwd/-/parse-passwd-1.0.0.tgz#6d5b934a456993b23d37f40a382d6f1666a8e5c6" + integrity sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q== + +parse-path@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/parse-path/-/parse-path-7.0.0.tgz#605a2d58d0a749c8594405d8cc3a2bf76d16099b" + integrity sha512-Euf9GG8WT9CdqwuWJGdf3RkUcTBArppHABkO7Lm8IzRQp0e2r/kkFnmhu4TSK30Wcu5rVAZLmfPKSBBi9tWFog== + dependencies: + protocols "^2.0.0" + +parse-url@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/parse-url/-/parse-url-8.1.0.tgz#972e0827ed4b57fc85f0ea6b0d839f0d8a57a57d" + integrity sha512-xDvOoLU5XRrcOZvnI6b8zA6n9O9ejNk/GExuz1yBuWUGn9KA97GI6HTs6u02wKara1CeVmZhH+0TZFdWScR89w== + dependencies: + parse-path "^7.0.0" + +parse5-htmlparser2-tree-adapter@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz#2cdf9ad823321140370d4dbf5d3e92c7c8ddc6e6" + integrity sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA== + dependencies: + parse5 "^6.0.1" + +parse5@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-5.1.1.tgz#f68e4e5ba1852ac2cadc00f4555fff6c2abb6178" + integrity sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug== + +parse5@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-6.0.1.tgz#e1a1c085c569b3dc08321184f19a39cc27f7c30b" + integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== + +path-exists@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" + integrity sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ== + +path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== + +path-key@^3.0.0, path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + +path-parse@^1.0.6, path-parse@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== + +path-scurry@^1.10.1, path-scurry@^1.6.1: + version "1.10.1" + resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.10.1.tgz#9ba6bf5aa8500fe9fd67df4f0d9483b2b0bfc698" + integrity sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ== + dependencies: + lru-cache "^9.1.1 || ^10.0.0" + minipass "^5.0.0 || ^6.0.2 || ^7.0.0" + +path-type@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-3.0.0.tgz#cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f" + integrity sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg== + dependencies: + pify "^3.0.0" + +path-type@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" + integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== + +pbkdf2@^3.0.17: + version "3.1.2" + resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.1.2.tgz#dd822aa0887580e52f1a039dc3eda108efae3075" + integrity sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA== + dependencies: + create-hash "^1.1.2" + create-hmac "^1.1.4" + ripemd160 "^2.0.1" + safe-buffer "^5.0.1" + sha.js "^2.4.8" + +picocolors@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" + integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== + +picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3, picomatch@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== + +pify@5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-5.0.0.tgz#1f5eca3f5e87ebec28cc6d54a0e4aaf00acc127f" + integrity sha512-eW/gHNMlxdSP6dmG6uJip6FXN0EQBwm2clYYd8Wul42Cwu/DK8HEftzsapcNdYe2MfLiIwZqsDk2RDEsTE79hA== + +pify@^2.0.0, pify@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" + integrity sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog== + +pify@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" + integrity sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg== + +pify@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" + integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== + +pinkie-promise@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" + integrity sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw== + dependencies: + pinkie "^2.0.0" + +pinkie@^2.0.0: + version "2.0.4" + resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" + integrity sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg== + +pirates@^4.0.4: + version "4.0.6" + resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.6.tgz#3018ae32ecfcff6c29ba2267cbf21166ac1f36b9" + integrity sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg== + +pkg-dir@^4.1.0, pkg-dir@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" + integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== + dependencies: + find-up "^4.0.0" + +prelude-ls@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" + integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== + +prettier-linter-helpers@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz#d23d41fe1375646de2d0104d3454a3008802cf7b" + integrity sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w== + dependencies: + fast-diff "^1.1.2" + +prettier@^3.0.3: + version "3.2.5" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.2.5.tgz#e52bc3090586e824964a8813b09aba6233b28368" + integrity sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A== + +pretty-format@^29.0.0, pretty-format@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-29.7.0.tgz#ca42c758310f365bfa71a0bda0a807160b776812" + integrity sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ== + dependencies: + "@jest/schemas" "^29.6.3" + ansi-styles "^5.0.0" + react-is "^18.0.0" + +proc-log@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/proc-log/-/proc-log-3.0.0.tgz#fb05ef83ccd64fd7b20bbe9c8c1070fc08338dd8" + integrity sha512-++Vn7NS4Xf9NacaU9Xq3URUuqZETPsf8L4j5/ckhaRYsfPeRyzGw+iDjFhV/Jr3uNmTvvddEJFWh5R1gRgUH8A== + +process-nextick-args@~2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" + integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== + +progress@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" + integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== + +promise-inflight@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" + integrity sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g== + +promise-retry@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/promise-retry/-/promise-retry-2.0.1.tgz#ff747a13620ab57ba688f5fc67855410c370da22" + integrity sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g== + dependencies: + err-code "^2.0.2" + retry "^0.12.0" + +prompts@^2.0.1: + version "2.4.2" + resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.2.tgz#7b57e73b3a48029ad10ebd44f74b01722a4cb069" + integrity sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q== + dependencies: + kleur "^3.0.3" + sisteransi "^1.0.5" + +promzard@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/promzard/-/promzard-1.0.0.tgz#3246f8e6c9895a77c0549cefb65828ac0f6c006b" + integrity sha512-KQVDEubSUHGSt5xLakaToDFrSoZhStB8dXLzk2xvwR67gJktrHFvpR63oZgHyK19WKbHFLXJqCPXdVR3aBP8Ig== + dependencies: + read "^2.0.0" + +propagate@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/propagate/-/propagate-2.0.1.tgz#40cdedab18085c792334e64f0ac17256d38f9a45" + integrity sha512-vGrhOavPSTz4QVNuBNdcNXePNdNMaO1xj9yBeH1ScQPjk/rhg9sSlCXPhMkFuaNNW/syTvYqsnbIJxMBfRbbag== + +protochain@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/protochain/-/protochain-1.0.5.tgz#991c407e99de264aadf8f81504b5e7faf7bfa260" + integrity sha512-4hDwFSX50C4NE6f/6zg8EPr/WLPTkFPUtG0ulWZu6bwzV2hmb50fpdQLr0HiKBAUehapaFpItzWoCLjraLJhUA== + +protocols@^2.0.0, protocols@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/protocols/-/protocols-2.0.1.tgz#8f155da3fc0f32644e83c5782c8e8212ccf70a86" + integrity sha512-/XJ368cyBJ7fzLMwLKv1e4vLxOju2MNAIokcr7meSaNcVbWz/CPcW22cP04mwxOErdA5mwjA8Q6w/cdAQxVn7Q== + +proxy-from-env@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" + integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== + +punycode@^2.1.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" + integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== + +pure-rand@^6.0.0: + version "6.0.4" + resolved "https://registry.yarnpkg.com/pure-rand/-/pure-rand-6.0.4.tgz#50b737f6a925468679bff00ad20eade53f37d5c7" + integrity sha512-LA0Y9kxMYv47GIPJy6MI84fqTd2HmYZI83W/kM/SkKfDlajnZYfmXFTxkbY+xSBPkLJxltMa9hIkmdc29eguMA== + +query-string@^8.1.0: + version "8.2.0" + resolved "https://registry.yarnpkg.com/query-string/-/query-string-8.2.0.tgz#f0b0ef6caa85f525dbdb745a67d3f8c08d71cc6b" + integrity sha512-tUZIw8J0CawM5wyGBiDOAp7ObdRQh4uBor/fUR9ZjmbZVvw95OD9If4w3MQxr99rg0DJZ/9CIORcpEqU5hQG7g== + dependencies: + decode-uri-component "^0.4.1" + filter-obj "^5.1.0" + split-on-first "^3.0.0" + +queue-microtask@^1.2.2, queue-microtask@^1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" + integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== + +quick-lru@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-4.0.1.tgz#5b8878f113a58217848c6482026c73e1ba57727f" + integrity sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g== + +randombytes@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" + integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== + dependencies: + safe-buffer "^5.1.0" + +raw-body@^2.4.1: + version "2.5.2" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.2.tgz#99febd83b90e08975087e8f1f9419a149366b68a" + integrity sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA== + dependencies: + bytes "3.1.2" + http-errors "2.0.0" + iconv-lite "0.4.24" + unpipe "1.0.0" + +react-is@^18.0.0: + version "18.2.0" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.2.0.tgz#199431eeaaa2e09f86427efbb4f1473edb47609b" + integrity sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w== + +read-cmd-shim@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/read-cmd-shim/-/read-cmd-shim-4.0.0.tgz#640a08b473a49043e394ae0c7a34dd822c73b9bb" + integrity sha512-yILWifhaSEEytfXI76kB9xEEiG1AiozaCJZ83A87ytjRiN+jVibXjedjCRNjoZviinhG+4UkalO3mWTd8u5O0Q== + +read-package-json-fast@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/read-package-json-fast/-/read-package-json-fast-3.0.2.tgz#394908a9725dc7a5f14e70c8e7556dff1d2b1049" + integrity sha512-0J+Msgym3vrLOUB3hzQCuZHII0xkNGCtz/HJH9xZshwv9DbDwkw1KaE3gx/e2J5rpEY5rtOy6cyhKOPrkP7FZw== + dependencies: + json-parse-even-better-errors "^3.0.0" + npm-normalize-package-bin "^3.0.0" + +read-package-json@6.0.4, read-package-json@^6.0.0: + version "6.0.4" + resolved "https://registry.yarnpkg.com/read-package-json/-/read-package-json-6.0.4.tgz#90318824ec456c287437ea79595f4c2854708836" + integrity sha512-AEtWXYfopBj2z5N5PbkAOeNHRPUg5q+Nen7QLxV8M2zJq1ym6/lCz3fYNTCXe19puu2d06jfHhrP7v/S2PtMMw== + dependencies: + glob "^10.2.2" + json-parse-even-better-errors "^3.0.0" + normalize-package-data "^5.0.0" + npm-normalize-package-bin "^3.0.0" + +read-pkg-up@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-3.0.0.tgz#3ed496685dba0f8fe118d0691dc51f4a1ff96f07" + integrity sha512-YFzFrVvpC6frF1sz8psoHDBGF7fLPc+llq/8NB43oagqWkx8ar5zYtsTORtOjw9W2RHLpWP+zTWwBvf1bCmcSw== + dependencies: + find-up "^2.0.0" + read-pkg "^3.0.0" + +read-pkg-up@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-7.0.1.tgz#f3a6135758459733ae2b95638056e1854e7ef507" + integrity sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg== + dependencies: + find-up "^4.1.0" + read-pkg "^5.2.0" + type-fest "^0.8.1" + +read-pkg@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-3.0.0.tgz#9cbc686978fee65d16c00e2b19c237fcf6e38389" + integrity sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA== + dependencies: + load-json-file "^4.0.0" + normalize-package-data "^2.3.2" + path-type "^3.0.0" + +read-pkg@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-5.2.0.tgz#7bf295438ca5a33e56cd30e053b34ee7250c93cc" + integrity sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg== + dependencies: + "@types/normalize-package-data" "^2.4.0" + normalize-package-data "^2.5.0" + parse-json "^5.0.0" + type-fest "^0.6.0" + +read@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/read/-/read-2.1.0.tgz#69409372c54fe3381092bc363a00650b6ac37218" + integrity sha512-bvxi1QLJHcaywCAEsAk4DG3nVoqiY2Csps3qzWalhj5hFqRn1d/OixkFXtLO1PrgHUcAP0FNaSY/5GYNfENFFQ== + dependencies: + mute-stream "~1.0.0" + +readable-stream@^3.0.0, readable-stream@^3.0.2, readable-stream@^3.1.1, readable-stream@^3.4.0, readable-stream@^3.6.0: + version "3.6.2" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" + integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + +readable-stream@~2.3.6: + version "2.3.8" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.8.tgz#91125e8042bba1b9887f49345f6277027ce8be9b" + integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA== + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~2.0.0" + safe-buffer "~5.1.1" + string_decoder "~1.1.1" + util-deprecate "~1.0.1" + +readdirp@~3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" + integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== + dependencies: + picomatch "^2.2.1" + +redent@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/redent/-/redent-3.0.0.tgz#e557b7998316bb53c9f1f56fa626352c6963059f" + integrity sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg== + dependencies: + indent-string "^4.0.0" + strip-indent "^3.0.0" + +regenerator-runtime@^0.14.0: + version "0.14.1" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz#356ade10263f685dda125100cd862c1db895327f" + integrity sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw== + +regexp-tree@~0.1.1: + version "0.1.27" + resolved "https://registry.yarnpkg.com/regexp-tree/-/regexp-tree-0.1.27.tgz#2198f0ef54518ffa743fe74d983b56ffd631b6cd" + integrity sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA== + +regexp.prototype.flags@^1.5.1: + version "1.5.2" + resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz#138f644a3350f981a858c44f6bb1a61ff59be334" + integrity sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw== + dependencies: + call-bind "^1.0.6" + define-properties "^1.2.1" + es-errors "^1.3.0" + set-function-name "^2.0.1" + +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== + +require-from-string@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" + integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== + +resolve-cwd@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d" + integrity sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg== + dependencies: + resolve-from "^5.0.0" + +resolve-dir@^1.0.0, resolve-dir@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/resolve-dir/-/resolve-dir-1.0.1.tgz#79a40644c362be82f26effe739c9bb5382046f43" + integrity sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg== + dependencies: + expand-tilde "^2.0.0" + global-modules "^1.0.0" + +resolve-from@5.0.0, resolve-from@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" + integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== + +resolve-from@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" + integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== + +resolve.exports@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/resolve.exports/-/resolve.exports-2.0.2.tgz#f8c934b8e6a13f539e38b7098e2e36134f01e800" + integrity sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg== + +resolve@1.17.0: + version "1.17.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.17.0.tgz#b25941b54968231cc2d1bb76a79cb7f2c0bf8444" + integrity sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w== + dependencies: + path-parse "^1.0.6" + +resolve@^1.10.0, resolve@^1.20.0, resolve@^1.22.4: + version "1.22.8" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.8.tgz#b6c87a9f2aa06dfab52e3d70ac8cde321fa5a48d" + integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw== + dependencies: + is-core-module "^2.13.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + +restore-cursor@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" + integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== + dependencies: + onetime "^5.1.0" + signal-exit "^3.0.2" + +retry@^0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b" + integrity sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow== + +reusify@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" + integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== + +rimraf@3.0.2, rimraf@^3.0.0, rimraf@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" + integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== + dependencies: + glob "^7.1.3" + +rimraf@^2.2.8: + version "2.7.1" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" + integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== + dependencies: + glob "^7.1.3" + +rimraf@^4.4.1: + version "4.4.1" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-4.4.1.tgz#bd33364f67021c5b79e93d7f4fa0568c7c21b755" + integrity sha512-Gk8NlF062+T9CqNGn6h4tls3k6T1+/nXdOcSZVikNVtlRdYpA7wRJJMoXmuvOnLW844rPjdQ7JgXCYM6PPC/og== + dependencies: + glob "^9.2.0" + +rimraf@^5.0.1: + version "5.0.5" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-5.0.5.tgz#9be65d2d6e683447d2e9013da2bf451139a61ccf" + integrity sha512-CqDakW+hMe/Bz202FPEymy68P+G50RfMQK+Qo5YUqc9SPipvbGjCGKd0RSKEelbsfQuw3g5NZDSrlZZAJurH1A== + dependencies: + glob "^10.3.7" + +ripemd160@^2.0.0, ripemd160@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c" + integrity sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA== + dependencies: + hash-base "^3.0.0" + inherits "^2.0.1" + +rlp@^2.2.3: + version "2.2.7" + resolved "https://registry.yarnpkg.com/rlp/-/rlp-2.2.7.tgz#33f31c4afac81124ac4b283e2bd4d9720b30beaf" + integrity sha512-d5gdPmgQ0Z+AklL2NVXr/IoSjNZFfTVvQWzL/AM2AOcSzYP2xjlb0AC8YyCLc41MSNf6P6QVtjgPdmVtzb+4lQ== + dependencies: + bn.js "^5.2.0" + +run-async@^2.4.0: + version "2.4.1" + resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455" + integrity sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ== + +run-parallel-limit@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/run-parallel-limit/-/run-parallel-limit-1.1.0.tgz#be80e936f5768623a38a963262d6bef8ff11e7ba" + integrity sha512-jJA7irRNM91jaKc3Hcl1npHsFLOXOoTkPCUL1JEa1R82O2miplXXRaGdjW/KM/98YQWDhJLiSs793CnXfblJUw== + dependencies: + queue-microtask "^1.2.2" + +run-parallel@^1.1.9: + version "1.2.0" + resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" + integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== + dependencies: + queue-microtask "^1.2.2" + +rustbn.js@~0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/rustbn.js/-/rustbn.js-0.2.0.tgz#8082cb886e707155fd1cb6f23bd591ab8d55d0ca" + integrity sha512-4VlvkRUuCJvr2J6Y0ImW7NvTCriMi7ErOAqWk1y69vAdoNIzCF3yPmgeNzx+RQTLEDFq5sHfscn1MwHxP9hNfA== + +rxjs@^7.5.5, rxjs@^7.8.1: + version "7.8.1" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.8.1.tgz#6f6f3d99ea8044291efd92e7c7fcf562c4057543" + integrity sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg== + dependencies: + tslib "^2.1.0" + +safe-array-concat@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/safe-array-concat/-/safe-array-concat-1.1.0.tgz#8d0cae9cb806d6d1c06e08ab13d847293ebe0692" + integrity sha512-ZdQ0Jeb9Ofti4hbt5lX3T2JcAamT9hfzYU1MNB+z/jaEbB6wfFfPIR/zEORmZqobkCCJhSjodobH6WHNmJ97dg== + dependencies: + call-bind "^1.0.5" + get-intrinsic "^1.2.2" + has-symbols "^1.0.3" + isarray "^2.0.5" + +safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@~5.2.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.2" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + +safe-regex-test@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.0.3.tgz#a5b4c0f06e0ab50ea2c395c14d8371232924c377" + integrity sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw== + dependencies: + call-bind "^1.0.6" + es-errors "^1.3.0" + is-regex "^1.1.4" + +safe-regex@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-2.1.1.tgz#f7128f00d056e2fe5c11e81a1324dd974aadced2" + integrity sha512-rx+x8AMzKb5Q5lQ95Zoi6ZbJqwCLkqi3XuJXp5P3rT8OEc6sZCJG5AE5dU3lsgRr/F4Bs31jSlVN+j5KrsGu9A== + dependencies: + regexp-tree "~0.1.1" + +safe-stable-stringify@^2.3.1: + version "2.4.3" + resolved "https://registry.yarnpkg.com/safe-stable-stringify/-/safe-stable-stringify-2.4.3.tgz#138c84b6f6edb3db5f8ef3ef7115b8f55ccbf886" + integrity sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g== + +"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0": + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +scrypt-js@3.0.1, scrypt-js@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/scrypt-js/-/scrypt-js-3.0.1.tgz#d314a57c2aef69d1ad98a138a21fe9eafa9ee312" + integrity sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA== + +secp256k1@4.0.3, secp256k1@^4.0.1: + version "4.0.3" + resolved "https://registry.yarnpkg.com/secp256k1/-/secp256k1-4.0.3.tgz#c4559ecd1b8d3c1827ed2d1b94190d69ce267303" + integrity sha512-NLZVf+ROMxwtEj3Xa562qgv2BK5e2WNmXPiOdVIPLgs6lyTzMvBq0aWTYMI5XCP9jZMVKOcqZLw/Wc4vDkuxhA== + dependencies: + elliptic "^6.5.4" + node-addon-api "^2.0.0" + node-gyp-build "^4.2.0" + +"semver@2 || 3 || 4 || 5", semver@^5.5.0, semver@^5.6.0: + version "5.7.2" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.2.tgz#48d55db737c3287cd4835e17fa13feace1c41ef8" + integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== + +semver@7.5.3: + version "7.5.3" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.3.tgz#161ce8c2c6b4b3bdca6caadc9fa3317a4c4fe88e" + integrity sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ== + dependencies: + lru-cache "^6.0.0" + +semver@^6.0.0, semver@^6.3.0, semver@^6.3.1: + version "6.3.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" + integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== + +semver@^7.0.0, semver@^7.1.1, semver@^7.3.4, semver@^7.3.5, semver@^7.3.7, semver@^7.3.8, semver@^7.5.3, semver@^7.5.4: + version "7.6.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.0.tgz#1a46a4db4bffcccd97b743b5005c8325f23d4e2d" + integrity sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg== + dependencies: + lru-cache "^6.0.0" + +serialize-javascript@6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.0.tgz#efae5d88f45d7924141da8b5c3a7a7e663fefeb8" + integrity sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag== + dependencies: + randombytes "^2.1.0" + +serializerr@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/serializerr/-/serializerr-1.0.3.tgz#12d4c5aa1c3ffb8f6d1dc5f395aa9455569c3f91" + integrity sha512-yXUlHj0fjbndhACj2XWtIH5eJv7b/uadyl7CJA8b9wL5mIKm+g0/sL7rDzEmjC+k5y8ggcaP8i049F4FxA0U9Q== + dependencies: + protochain "^1.0.5" + +set-blocking@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" + integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw== + +set-function-length@^1.2.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.1.tgz#47cc5945f2c771e2cf261c6737cf9684a2a5e425" + integrity sha512-j4t6ccc+VsKwYHso+kElc5neZpjtq9EnRICFZtWyBsLojhmeF/ZBd/elqm22WJh/BziDe/SBiOeAt0m2mfLD0g== + dependencies: + define-data-property "^1.1.2" + es-errors "^1.3.0" + function-bind "^1.1.2" + get-intrinsic "^1.2.3" + gopd "^1.0.1" + has-property-descriptors "^1.0.1" + +set-function-name@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/set-function-name/-/set-function-name-2.0.1.tgz#12ce38b7954310b9f61faa12701620a0c882793a" + integrity sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA== + dependencies: + define-data-property "^1.0.1" + functions-have-names "^1.2.3" + has-property-descriptors "^1.0.0" + +setimmediate@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" + integrity sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA== + +setprototypeof@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" + integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== + +sha.js@^2.4.0, sha.js@^2.4.8: + version "2.4.11" + resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" + integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ== + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + +shallow-clone@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/shallow-clone/-/shallow-clone-3.0.1.tgz#8f2981ad92531f55035b01fb230769a40e02efa3" + integrity sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA== + dependencies: + kind-of "^6.0.2" + +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" + +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + +shell-quote@^1.8.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.8.1.tgz#6dbf4db75515ad5bac63b4f1894c3a154c766680" + integrity sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA== + +shiki@^0.14.7: + version "0.14.7" + resolved "https://registry.yarnpkg.com/shiki/-/shiki-0.14.7.tgz#c3c9e1853e9737845f1d2ef81b31bcfb07056d4e" + integrity sha512-dNPAPrxSc87ua2sKJ3H5dQ/6ZaY8RNnaAqK+t0eG7p0Soi2ydiqbGOTaZCqaYvA/uZYfS1LJnemt3Q+mSfcPCg== + dependencies: + ansi-sequence-parser "^1.1.0" + jsonc-parser "^3.2.0" + vscode-oniguruma "^1.7.0" + vscode-textmate "^8.0.0" + +side-channel@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.5.tgz#9a84546599b48909fb6af1211708d23b1946221b" + integrity sha512-QcgiIWV4WV7qWExbN5llt6frQB/lBven9pqliLXfGPB+K9ZYXxDozp0wLkHS24kWCm+6YXH/f0HhnObZnZOBnQ== + dependencies: + call-bind "^1.0.6" + es-errors "^1.3.0" + get-intrinsic "^1.2.4" + object-inspect "^1.13.1" + +signal-exit@3.0.7, signal-exit@^3.0.2, signal-exit@^3.0.3, signal-exit@^3.0.7: + version "3.0.7" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" + integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== + +signal-exit@^4.0.1: + version "4.1.0" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04" + integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== + +sigstore@^1.3.0, sigstore@^1.4.0: + version "1.9.0" + resolved "https://registry.yarnpkg.com/sigstore/-/sigstore-1.9.0.tgz#1e7ad8933aa99b75c6898ddd0eeebc3eb0d59875" + integrity sha512-0Zjz0oe37d08VeOtBIuB6cRriqXse2e8w+7yIy2XSXjshRKxbc2KkhXjL229jXSxEm7UbcjS76wcJDGQddVI9A== + dependencies: + "@sigstore/bundle" "^1.1.0" + "@sigstore/protobuf-specs" "^0.2.0" + "@sigstore/sign" "^1.0.0" + "@sigstore/tuf" "^1.0.3" + make-fetch-happen "^11.0.1" + +simple-swizzle@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a" + integrity sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg== + dependencies: + is-arrayish "^0.3.1" + +sisteransi@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" + integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== + +slash@3.0.0, slash@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" + integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== + +smart-buffer@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-4.2.0.tgz#6e1d71fa4f18c05f7d0ff216dd16a481d0e8d9ae" + integrity sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg== + +socks-proxy-agent@^6.0.0: + version "6.2.1" + resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-6.2.1.tgz#2687a31f9d7185e38d530bef1944fe1f1496d6ce" + integrity sha512-a6KW9G+6B3nWZ1yB8G7pJwL3ggLy1uTzKAgCb7ttblwqdz9fMGJUuTy3uFzEP48FAs9FLILlmzDlE2JJhVQaXQ== + dependencies: + agent-base "^6.0.2" + debug "^4.3.3" + socks "^2.6.2" + +socks-proxy-agent@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-7.0.0.tgz#dc069ecf34436621acb41e3efa66ca1b5fed15b6" + integrity sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww== + dependencies: + agent-base "^6.0.2" + debug "^4.3.3" + socks "^2.6.2" + +socks@^2.6.2: + version "2.7.3" + resolved "https://registry.yarnpkg.com/socks/-/socks-2.7.3.tgz#7d8a75d7ce845c0a96f710917174dba0d543a785" + integrity sha512-vfuYK48HXCTFD03G/1/zkIls3Ebr2YNa4qU9gHDZdblHLiqhJrJGkY3+0Nx0JpN9qBhJbVObc1CNciT1bIZJxw== + dependencies: + ip-address "^9.0.5" + smart-buffer "^4.2.0" + +solc@0.7.3: + version "0.7.3" + resolved "https://registry.yarnpkg.com/solc/-/solc-0.7.3.tgz#04646961bd867a744f63d2b4e3c0701ffdc7d78a" + integrity sha512-GAsWNAjGzIDg7VxzP6mPjdurby3IkGCjQcM8GFYZT6RyaoUZKmMU6Y7YwG+tFGhv7dwZ8rmR4iwFDrrD99JwqA== + dependencies: + command-exists "^1.2.8" + commander "3.0.2" + follow-redirects "^1.12.1" + fs-extra "^0.30.0" + js-sha3 "0.8.0" + memorystream "^0.3.1" + require-from-string "^2.0.0" + semver "^5.5.0" + tmp "0.0.33" + +sort-keys@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/sort-keys/-/sort-keys-2.0.0.tgz#658535584861ec97d730d6cf41822e1f56684128" + integrity sha512-/dPCrG1s3ePpWm6yBbxZq5Be1dXGLyLn9Z791chDC3NFrpkVbWGzkBwPN1knaciexFXgRJ7hzdnwZ4stHSDmjg== + dependencies: + is-plain-obj "^1.0.0" + +source-map-support@0.5.13: + version "0.5.13" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.13.tgz#31b24a9c2e73c2de85066c0feb7d44767ed52932" + integrity sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map-support@^0.5.13: + version "0.5.21" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" + integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map@^0.6.0, source-map@^0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +spawn-command@0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/spawn-command/-/spawn-command-0.0.2.tgz#9544e1a43ca045f8531aac1a48cb29bdae62338e" + integrity sha512-zC8zGoGkmc8J9ndvml8Xksr1Amk9qBujgbF0JAIWO7kXr43w0h/0GJNM/Vustixu+YE8N/MTrQ7N31FvHUACxQ== + +spdx-correct@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.2.0.tgz#4f5ab0668f0059e34f9c00dce331784a12de4e9c" + integrity sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA== + dependencies: + spdx-expression-parse "^3.0.0" + spdx-license-ids "^3.0.0" + +spdx-exceptions@^2.1.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.4.0.tgz#c07a4ede25b16e4f78e6707bbd84b15a45c19c1b" + integrity sha512-hcjppoJ68fhxA/cjbN4T8N6uCUejN8yFw69ttpqtBeCbF3u13n7mb31NB9jKwGTTWWnt9IbRA/mf1FprYS8wfw== + +spdx-expression-parse@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz#cf70f50482eefdc98e3ce0a6833e4a53ceeba679" + integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q== + dependencies: + spdx-exceptions "^2.1.0" + spdx-license-ids "^3.0.0" + +spdx-license-ids@^3.0.0: + version "3.0.17" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.17.tgz#887da8aa73218e51a1d917502d79863161a93f9c" + integrity sha512-sh8PWc/ftMqAAdFiBu6Fy6JUOYjqDJBJvIhpfDMyHrr0Rbp5liZqd4TjtQ/RgfLjKFZb+LMx5hpml5qOWy0qvg== + +split-on-first@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/split-on-first/-/split-on-first-3.0.0.tgz#f04959c9ea8101b9b0bbf35a61b9ebea784a23e7" + integrity sha512-qxQJTx2ryR0Dw0ITYyekNQWpz6f8dGd7vffGNflQQ3Iqj9NJ6qiZ7ELpZsJ/QBhIVAiDfXdag3+Gp8RvWa62AA== + +split2@^3.2.2: + version "3.2.2" + resolved "https://registry.yarnpkg.com/split2/-/split2-3.2.2.tgz#bf2cf2a37d838312c249c89206fd7a17dd12365f" + integrity sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg== + dependencies: + readable-stream "^3.0.0" + +split@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/split/-/split-1.0.1.tgz#605bd9be303aa59fb35f9229fbea0ddec9ea07d9" + integrity sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg== + dependencies: + through "2" + +sprintf-js@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.1.3.tgz#4914b903a2f8b685d17fdf78a70e917e872e444a" + integrity sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA== + +sprintf-js@~1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== + +ssri@^10.0.0, ssri@^10.0.1: + version "10.0.5" + resolved "https://registry.yarnpkg.com/ssri/-/ssri-10.0.5.tgz#e49efcd6e36385196cb515d3a2ad6c3f0265ef8c" + integrity sha512-bSf16tAFkGeRlUNDjXu8FzaMQt6g2HZJrun7mtMbIPOddxt3GLMSz5VWUWcqTJUPfLEaDIepGxv+bYQW49596A== + dependencies: + minipass "^7.0.3" + +ssri@^8.0.0, ssri@^8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/ssri/-/ssri-8.0.1.tgz#638e4e439e2ffbd2cd289776d5ca457c4f51a2af" + integrity sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ== + dependencies: + minipass "^3.1.1" + +ssri@^9.0.0, ssri@^9.0.1: + version "9.0.1" + resolved "https://registry.yarnpkg.com/ssri/-/ssri-9.0.1.tgz#544d4c357a8d7b71a19700074b6883fcb4eae057" + integrity sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q== + dependencies: + minipass "^3.1.1" + +stack-trace@0.0.x: + version "0.0.10" + resolved "https://registry.yarnpkg.com/stack-trace/-/stack-trace-0.0.10.tgz#547c70b347e8d32b4e108ea1a2a159e5fdde19c0" + integrity sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg== + +stack-utils@^2.0.3: + version "2.0.6" + resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.6.tgz#aaf0748169c02fc33c8232abccf933f54a1cc34f" + integrity sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ== + dependencies: + escape-string-regexp "^2.0.0" + +stacktrace-parser@^0.1.10: + version "0.1.10" + resolved "https://registry.yarnpkg.com/stacktrace-parser/-/stacktrace-parser-0.1.10.tgz#29fb0cae4e0d0b85155879402857a1639eb6051a" + integrity sha512-KJP1OCML99+8fhOHxwwzyWrlUuVX5GQ0ZpJTd1DFXhdkrvg1szxfHhawXUZ3g9TkXORQd4/WG68jMlQZ2p8wlg== + dependencies: + type-fest "^0.7.1" + +statuses@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" + integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== + +string-length@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/string-length/-/string-length-4.0.2.tgz#a8a8dc7bd5c1a82b9b3c8b87e125f66871b6e57a" + integrity sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ== + dependencies: + char-regex "^1.0.2" + strip-ansi "^6.0.0" + +"string-width-cjs@npm:string-width@^4.2.0", "string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.2, string-width@^4.2.3: + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +string-width@^5.0.1, string-width@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794" + integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== + dependencies: + eastasianwidth "^0.2.0" + emoji-regex "^9.2.2" + strip-ansi "^7.0.1" + +string.prototype.trim@^1.2.8: + version "1.2.8" + resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz#f9ac6f8af4bd55ddfa8895e6aea92a96395393bd" + integrity sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + +string.prototype.trimend@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz#1bb3afc5008661d73e2dc015cd4853732d6c471e" + integrity sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + +string.prototype.trimstart@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz#d4cdb44b83a4737ffbac2d406e405d43d0184298" + integrity sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + +string_decoder@^1.1.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" + +string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== + dependencies: + safe-buffer "~5.1.0" + +"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.0, strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +strip-ansi@^7.0.1: + version "7.1.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" + integrity sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ== + dependencies: + ansi-regex "^6.0.1" + +strip-bom@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" + integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA== + +strip-bom@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-4.0.0.tgz#9c3505c1db45bcedca3d9cf7a16f5c5aa3901878" + integrity sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w== + +strip-comments@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/strip-comments/-/strip-comments-2.0.1.tgz#4ad11c3fbcac177a67a40ac224ca339ca1c1ba9b" + integrity sha512-ZprKx+bBLXv067WTCALv8SSz5l2+XhpYCsVtSqlMnkAXMWDq+/ekVbl1ghqP9rUHTzv6sm/DwCOiYutU/yp1fw== + +strip-final-newline@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" + integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== + +strip-hex-prefix@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/strip-hex-prefix/-/strip-hex-prefix-1.0.0.tgz#0c5f155fef1151373377de9dbb588da05500e36f" + integrity sha512-q8d4ue7JGEiVcypji1bALTos+0pWtyGlivAWyPuTkHzuTCJqrK9sWxYQZUq6Nq3cuyv3bm734IhHvHtGGURU6A== + dependencies: + is-hex-prefixed "1.0.0" + +strip-indent@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-3.0.0.tgz#c32e1cee940b6b3432c771bc2c54bcce73cd3001" + integrity sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ== + dependencies: + min-indent "^1.0.0" + +strip-json-comments@3.1.1, strip-json-comments@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" + integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== + +strip-outer@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/strip-outer/-/strip-outer-1.0.1.tgz#b2fd2abf6604b9d1e6013057195df836b8a9d631" + integrity sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg== + dependencies: + escape-string-regexp "^1.0.2" + +strong-log-transformer@2.1.0, strong-log-transformer@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/strong-log-transformer/-/strong-log-transformer-2.1.0.tgz#0f5ed78d325e0421ac6f90f7f10e691d6ae3ae10" + integrity sha512-B3Hgul+z0L9a236FAUC9iZsL+nVHgoCJnqCbN588DjYxvGXaXaaFbfmQ/JhvKjZwsOukuR72XbHv71Qkug0HxA== + dependencies: + duplexer "^0.1.1" + minimist "^1.2.0" + through "^2.3.4" + +supports-color@8.1.1, supports-color@^8.0.0, supports-color@^8.1.1: + version "8.1.1" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" + integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== + dependencies: + has-flag "^4.0.0" + +supports-color@^5.3.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== + dependencies: + has-flag "^3.0.0" + +supports-color@^7.1.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== + dependencies: + has-flag "^4.0.0" + +supports-preserve-symlinks-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" + integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== + +synckit@^0.8.6: + version "0.8.8" + resolved "https://registry.yarnpkg.com/synckit/-/synckit-0.8.8.tgz#fe7fe446518e3d3d49f5e429f443cf08b6edfcd7" + integrity sha512-HwOKAP7Wc5aRGYdKH+dw0PRRpbO841v2DENBtjnR5HFWoiNByAl7vrx3p0G/rCyYXQsrxqtX48TImFtPcIHSpQ== + dependencies: + "@pkgr/core" "^0.1.0" + tslib "^2.6.2" + +tar-stream@~2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-2.2.0.tgz#acad84c284136b060dc3faa64474aa9aebd77287" + integrity sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ== + dependencies: + bl "^4.0.3" + end-of-stream "^1.4.1" + fs-constants "^1.0.0" + inherits "^2.0.3" + readable-stream "^3.1.1" + +tar@6.1.11: + version "6.1.11" + resolved "https://registry.yarnpkg.com/tar/-/tar-6.1.11.tgz#6760a38f003afa1b2ffd0ffe9e9abbd0eab3d621" + integrity sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA== + dependencies: + chownr "^2.0.0" + fs-minipass "^2.0.0" + minipass "^3.0.0" + minizlib "^2.1.1" + mkdirp "^1.0.3" + yallist "^4.0.0" + +tar@^6.0.2, tar@^6.1.11, tar@^6.1.2: + version "6.2.0" + resolved "https://registry.yarnpkg.com/tar/-/tar-6.2.0.tgz#b14ce49a79cb1cd23bc9b016302dea5474493f73" + integrity sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ== + dependencies: + chownr "^2.0.0" + fs-minipass "^2.0.0" + minipass "^5.0.0" + minizlib "^2.1.1" + mkdirp "^1.0.3" + yallist "^4.0.0" + +temp-dir@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/temp-dir/-/temp-dir-1.0.0.tgz#0a7c0ea26d3a39afa7e0ebea9c1fc0bc4daa011d" + integrity sha512-xZFXEGbG7SNC3itwBzI3RYjq/cEhBkx2hJuKGIUOcEULmkQExXiHat2z/qkISYsuR+IKumhEfKKbV5qXmhICFQ== + +test-exclude@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-6.0.0.tgz#04a8698661d805ea6fa293b6cb9e63ac044ef15e" + integrity sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w== + dependencies: + "@istanbuljs/schema" "^0.1.2" + glob "^7.1.4" + minimatch "^3.0.4" + +text-extensions@^1.0.0: + version "1.9.0" + resolved "https://registry.yarnpkg.com/text-extensions/-/text-extensions-1.9.0.tgz#1853e45fee39c945ce6f6c36b2d659b5aabc2a26" + integrity sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ== + +text-hex@1.0.x: + version "1.0.0" + resolved "https://registry.yarnpkg.com/text-hex/-/text-hex-1.0.0.tgz#69dc9c1b17446ee79a92bf5b884bb4b9127506f5" + integrity sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg== + +text-table@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" + integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== + +thenify-all@^1.0.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/thenify-all/-/thenify-all-1.6.0.tgz#1a1918d402d8fc3f98fbf234db0bcc8cc10e9726" + integrity sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA== + dependencies: + thenify ">= 3.1.0 < 4" + +"thenify@>= 3.1.0 < 4": + version "3.3.1" + resolved "https://registry.yarnpkg.com/thenify/-/thenify-3.3.1.tgz#8932e686a4066038a016dd9e2ca46add9838a95f" + integrity sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw== + dependencies: + any-promise "^1.0.0" + +through2@^2.0.0: + version "2.0.5" + resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd" + integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ== + dependencies: + readable-stream "~2.3.6" + xtend "~4.0.1" + +through@2, "through@>=2.2.7 <3", through@^2.3.4, through@^2.3.6: + version "2.3.8" + resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" + integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== + +tmp@0.0.33, tmp@^0.0.33: + version "0.0.33" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" + integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== + dependencies: + os-tmpdir "~1.0.2" + +tmp@0.2.1, tmp@~0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.2.1.tgz#8457fc3037dcf4719c251367a1af6500ee1ccf14" + integrity sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ== + dependencies: + rimraf "^3.0.0" + +tmpl@1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.5.tgz#8683e0b902bb9c20c4f726e3c0b69f36518c07cc" + integrity sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw== + +to-fast-properties@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" + integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== + +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + +toidentifier@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" + integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== + +tr46@~0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" + integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== + +tree-kill@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/tree-kill/-/tree-kill-1.2.2.tgz#4ca09a9092c88b73a7cdc5e8a01b507b0790a0cc" + integrity sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A== + +treeify@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/treeify/-/treeify-1.1.0.tgz#4e31c6a463accd0943879f30667c4fdaff411bb8" + integrity sha512-1m4RA7xVAJrSGrrXGs0L3YTwyvBs2S8PbRHaLZAkFw7JR8oIFwYtysxlBZhYIa7xSyiYJKZ3iGrrk55cGA3i9A== + +trim-newlines@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-3.0.1.tgz#260a5d962d8b752425b32f3a7db0dcacd176c144" + integrity sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw== + +trim-repeated@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/trim-repeated/-/trim-repeated-1.0.0.tgz#e3646a2ea4e891312bf7eace6cfb05380bc01c21" + integrity sha512-pkonvlKk8/ZuR0D5tLW8ljt5I8kmxp2XKymhepUeOdCEfKpZaktSArkLHZt76OB1ZvO9bssUsDty4SWhLvZpLg== + dependencies: + escape-string-regexp "^1.0.2" + +triple-beam@^1.3.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/triple-beam/-/triple-beam-1.4.1.tgz#6fde70271dc6e5d73ca0c3b24e2d92afb7441984" + integrity sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg== + +ts-api-utils@^1.0.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-1.2.1.tgz#f716c7e027494629485b21c0df6180f4d08f5e8b" + integrity sha512-RIYA36cJn2WiH9Hy77hdF9r7oEwxAtB/TS9/S4Qd90Ap4z5FSiin5zEiTL44OII1Y3IIlEvxwxFUVgrHSZ/UpA== + +ts-jest@^29.1.1: + version "29.1.2" + resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-29.1.2.tgz#7613d8c81c43c8cb312c6904027257e814c40e09" + integrity sha512-br6GJoH/WUX4pu7FbZXuWGKGNDuU7b8Uj77g/Sp7puZV6EXzuByl6JrECvm0MzVzSTkSHWTihsXt+5XYER5b+g== + dependencies: + bs-logger "0.x" + fast-json-stable-stringify "2.x" + jest-util "^29.0.0" + json5 "^2.2.3" + lodash.memoize "4.x" + make-error "1.x" + semver "^7.5.3" + yargs-parser "^21.0.1" + +ts-node@^10.9.1: + version "10.9.2" + resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.9.2.tgz#70f021c9e185bccdca820e26dc413805c101c71f" + integrity sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ== + dependencies: + "@cspotcode/source-map-support" "^0.8.0" + "@tsconfig/node10" "^1.0.7" + "@tsconfig/node12" "^1.0.7" + "@tsconfig/node14" "^1.0.0" + "@tsconfig/node16" "^1.0.2" + acorn "^8.4.1" + acorn-walk "^8.1.1" + arg "^4.1.0" + create-require "^1.1.0" + diff "^4.0.1" + make-error "^1.1.1" + v8-compile-cache-lib "^3.0.1" + yn "3.1.1" + +tsconfig-paths@^3.15.0: + version "3.15.0" + resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz#5299ec605e55b1abb23ec939ef15edaf483070d4" + integrity sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg== + dependencies: + "@types/json5" "^0.0.29" + json5 "^1.0.2" + minimist "^1.2.6" + strip-bom "^3.0.0" + +tsconfig-paths@^4.1.2: + version "4.2.0" + resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz#ef78e19039133446d244beac0fd6a1632e2d107c" + integrity sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg== + dependencies: + json5 "^2.2.2" + minimist "^1.2.6" + strip-bom "^3.0.0" + +tslib@^1.9.3: + version "1.14.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" + integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== + +tslib@^2.1.0, tslib@^2.3.0, tslib@^2.4.0, tslib@^2.6.2: + version "2.6.2" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.2.tgz#703ac29425e7b37cd6fd456e92404d46d1f3e4ae" + integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q== + +tsort@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/tsort/-/tsort-0.0.1.tgz#e2280f5e817f8bf4275657fd0f9aebd44f5a2786" + integrity sha512-Tyrf5mxF8Ofs1tNoxA13lFeZ2Zrbd6cKbuH3V+MQ5sb6DtBj5FjrXVsRWT8YvNAQTqNoz66dz1WsbigI22aEnw== + +tuf-js@^1.1.7: + version "1.1.7" + resolved "https://registry.yarnpkg.com/tuf-js/-/tuf-js-1.1.7.tgz#21b7ae92a9373015be77dfe0cb282a80ec3bbe43" + integrity sha512-i3P9Kgw3ytjELUfpuKVDNBJvk4u5bXL6gskv572mcevPbSKCV3zt3djhmlEQ65yERjIbOSncy7U4cQJaB1CBCg== + dependencies: + "@tufjs/models" "1.0.4" + debug "^4.3.4" + make-fetch-happen "^11.1.1" + +tweetnacl-util@^0.15.1: + version "0.15.1" + resolved "https://registry.yarnpkg.com/tweetnacl-util/-/tweetnacl-util-0.15.1.tgz#b80fcdb5c97bcc508be18c44a4be50f022eea00b" + integrity sha512-RKJBIj8lySrShN4w6i/BonWp2Z/uxwC3h4y7xsRrpP59ZboCd0GpEVsOnMDYLMmKBpYhb5TgHzZXy7wTfYFBRw== + +tweetnacl@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-1.0.3.tgz#ac0af71680458d8a6378d0d0d050ab1407d35596" + integrity sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw== + +type-check@^0.4.0, type-check@~0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" + integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== + dependencies: + prelude-ls "^1.2.1" + +type-detect@4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" + integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== + +type-fest@^0.18.0: + version "0.18.1" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.18.1.tgz#db4bc151a4a2cf4eebf9add5db75508db6cc841f" + integrity sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw== + +type-fest@^0.20.2: + version "0.20.2" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" + integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== + +type-fest@^0.21.3: + version "0.21.3" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" + integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== + +type-fest@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.4.1.tgz#8bdf77743385d8a4f13ba95f610f5ccd68c728f8" + integrity sha512-IwzA/LSfD2vC1/YDYMv/zHP4rDF1usCwllsDpbolT3D4fUepIO7f9K70jjmUewU/LmGUKJcwcVtDCpnKk4BPMw== + +type-fest@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.6.0.tgz#8d2a2370d3df886eb5c90ada1c5bf6188acf838b" + integrity sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg== + +type-fest@^0.7.1: + version "0.7.1" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.7.1.tgz#8dda65feaf03ed78f0a3f9678f1869147f7c5c48" + integrity sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg== + +type-fest@^0.8.1: + version "0.8.1" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" + integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== + +typed-array-buffer@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/typed-array-buffer/-/typed-array-buffer-1.0.1.tgz#0608ffe6bca71bf15a45bff0ca2604107a1325f5" + integrity sha512-RSqu1UEuSlrBhHTWC8O9FnPjOduNs4M7rJ4pRKoEjtx1zUNOPN2sSXHLDX+Y2WPbHIxbvg4JFo2DNAEfPIKWoQ== + dependencies: + call-bind "^1.0.6" + es-errors "^1.3.0" + is-typed-array "^1.1.13" + +typed-array-byte-length@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz#d787a24a995711611fb2b87a4052799517b230d0" + integrity sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA== + dependencies: + call-bind "^1.0.2" + for-each "^0.3.3" + has-proto "^1.0.1" + is-typed-array "^1.1.10" + +typed-array-byte-offset@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz#cbbe89b51fdef9cd6aaf07ad4707340abbc4ea0b" + integrity sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg== + dependencies: + available-typed-arrays "^1.0.5" + call-bind "^1.0.2" + for-each "^0.3.3" + has-proto "^1.0.1" + is-typed-array "^1.1.10" + +typed-array-length@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.4.tgz#89d83785e5c4098bec72e08b319651f0eac9c1bb" + integrity sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng== + dependencies: + call-bind "^1.0.2" + for-each "^0.3.3" + is-typed-array "^1.1.9" + +typedarray@^0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" + integrity sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA== + +typedoc@^0.25.7: + version "0.25.8" + resolved "https://registry.yarnpkg.com/typedoc/-/typedoc-0.25.8.tgz#7d0e1bf12d23bf1c459fd4893c82cb855911ff12" + integrity sha512-mh8oLW66nwmeB9uTa0Bdcjfis+48bAjSH3uqdzSuSawfduROQLlXw//WSNZLYDdhmMVB7YcYZicq6e8T0d271A== + dependencies: + lunr "^2.3.9" + marked "^4.3.0" + minimatch "^9.0.3" + shiki "^0.14.7" + +"typescript@>=3 < 6", typescript@^5.3.3: + version "5.3.3" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.3.3.tgz#b3ce6ba258e72e6305ba66f5c9b452aaee3ffe37" + integrity sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw== + +uglify-js@^3.1.4: + version "3.17.4" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.17.4.tgz#61678cf5fa3f5b7eb789bb345df29afb8257c22c" + integrity sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g== + +unbox-primitive@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz#29032021057d5e6cdbd08c5129c226dff8ed6f9e" + integrity sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw== + dependencies: + call-bind "^1.0.2" + has-bigints "^1.0.2" + has-symbols "^1.0.3" + which-boxed-primitive "^1.0.2" + +undici-types@~5.26.4: + version "5.26.5" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" + integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== + +undici@^5.14.0: + version "5.28.3" + resolved "https://registry.yarnpkg.com/undici/-/undici-5.28.3.tgz#a731e0eff2c3fcfd41c1169a869062be222d1e5b" + integrity sha512-3ItfzbrhDlINjaP0duwnNsKpDQk3acHI3gVJ1z4fmwMK31k5G9OVIAMLSIaP6w4FaGkaAkN6zaQO9LUvZ1t7VA== + dependencies: + "@fastify/busboy" "^2.0.0" + +unidragger@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/unidragger/-/unidragger-3.0.1.tgz#72b2e63f2571ca6e95a884b139dfec764e08c7f3" + integrity sha512-RngbGSwBFmqGBWjkaH+yB677uzR95blSQyxq6hYbrQCejH3Mx1nm8DVOuh3M9k2fQyTstWUG5qlgCnNqV/9jVw== + dependencies: + ev-emitter "^2.0.0" + +unique-filename@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-1.1.1.tgz#1d69769369ada0583103a1e6ae87681b56573230" + integrity sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ== + dependencies: + unique-slug "^2.0.0" + +unique-filename@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-2.0.1.tgz#e785f8675a9a7589e0ac77e0b5c34d2eaeac6da2" + integrity sha512-ODWHtkkdx3IAR+veKxFV+VBkUMcN+FaqzUUd7IZzt+0zhDZFPFxhlqwPF3YQvMHx1TD0tdgYl+kuPnJ8E6ql7A== + dependencies: + unique-slug "^3.0.0" + +unique-filename@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-3.0.0.tgz#48ba7a5a16849f5080d26c760c86cf5cf05770ea" + integrity sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g== + dependencies: + unique-slug "^4.0.0" + +unique-slug@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-2.0.2.tgz#baabce91083fc64e945b0f3ad613e264f7cd4e6c" + integrity sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w== + dependencies: + imurmurhash "^0.1.4" + +unique-slug@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-3.0.0.tgz#6d347cf57c8a7a7a6044aabd0e2d74e4d76dc7c9" + integrity sha512-8EyMynh679x/0gqE9fT9oilG+qEt+ibFyqjuVTsZn1+CMxH+XLlpvr2UZx4nVcCwTpx81nICr2JQFkM+HPLq4w== + dependencies: + imurmurhash "^0.1.4" + +unique-slug@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-4.0.0.tgz#6bae6bb16be91351badd24cdce741f892a6532e3" + integrity sha512-WrcA6AyEfqDX5bWige/4NQfPZMtASNVxdmWR76WESYQVAACSgWcR6e9i0mofqqBxYFtL4oAxPIptY73/0YE1DQ== + dependencies: + imurmurhash "^0.1.4" + +universal-user-agent@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/universal-user-agent/-/universal-user-agent-6.0.1.tgz#15f20f55da3c930c57bddbf1734c6654d5fd35aa" + integrity sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ== + +universalify@^0.1.0: + version "0.1.2" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" + integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== + +universalify@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.1.tgz#168efc2180964e6386d061e094df61afe239b18d" + integrity sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw== + +unpipe@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" + integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== + +upath@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/upath/-/upath-2.0.1.tgz#50c73dea68d6f6b990f51d279ce6081665d61a8b" + integrity sha512-1uEe95xksV1O0CYKXo8vQvN1JEbtJp7lb7C5U9HMsIp6IVwntkH/oNUzyVNQSd4S1sYk2FpSSW44FqMc8qee5w== + +update-browserslist-db@^1.0.13: + version "1.0.13" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz#3c5e4f5c083661bd38ef64b6328c26ed6c8248c4" + integrity sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg== + dependencies: + escalade "^3.1.1" + picocolors "^1.0.0" + +uri-js@^4.2.2: + version "4.4.1" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" + integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== + dependencies: + punycode "^2.1.0" + +utf-8-validate@5.0.7: + version "5.0.7" + resolved "https://registry.yarnpkg.com/utf-8-validate/-/utf-8-validate-5.0.7.tgz#c15a19a6af1f7ad9ec7ddc425747ca28c3644922" + integrity sha512-vLt1O5Pp+flcArHGIyKEQq883nBt8nN8tVBcoL0qUXj2XT1n7p70yGIq2VK98I5FdZ1YHc0wk/koOnHjnXWk1Q== + dependencies: + node-gyp-build "^4.3.0" + +utf-8-validate@6.0.3: + version "6.0.3" + resolved "https://registry.yarnpkg.com/utf-8-validate/-/utf-8-validate-6.0.3.tgz#7d8c936d854e86b24d1d655f138ee27d2636d777" + integrity sha512-uIuGf9TWQ/y+0Lp+KGZCMuJWc3N9BHA+l/UmHd/oUHwJJDeysyTRxNQVkbzsIWfGFbRe3OcgML/i0mvVRPOyDA== + dependencies: + node-gyp-build "^4.3.0" + +utf8@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/utf8/-/utf8-3.0.0.tgz#f052eed1364d696e769ef058b183df88c87f69d1" + integrity sha512-E8VjFIQ/TyQgp+TZfS6l8yp/xWppSAHzidGiRrqe4bK4XP9pTRyKFgGJpO3SN7zdX4DeomTrwaseCHovfpFcqQ== + +util-deprecate@^1.0.1, util-deprecate@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== + +uuid@8.3.2, uuid@^8.3.2: + version "8.3.2" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" + integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== + +uuid@^9.0.0: + version "9.0.1" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-9.0.1.tgz#e188d4c8853cc722220392c424cd637f32293f30" + integrity sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA== + +uuidv4@^6.2.13: + version "6.2.13" + resolved "https://registry.yarnpkg.com/uuidv4/-/uuidv4-6.2.13.tgz#8f95ec5ef22d1f92c8e5d4c70b735d1c89572cb7" + integrity sha512-AXyzMjazYB3ovL3q051VLH06Ixj//Knx7QnUSi1T//Ie3io6CpsPu9nVMOx5MoLWh6xV0B9J0hIaxungxXUbPQ== + dependencies: + "@types/uuid" "8.3.4" + uuid "8.3.2" + +v8-compile-cache-lib@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz#6336e8d71965cb3d35a1bbb7868445a7c05264bf" + integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg== + +v8-compile-cache@2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz#2de19618c66dc247dcfb6f99338035d8245a2cee" + integrity sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA== + +v8-to-istanbul@^9.0.1: + version "9.2.0" + resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-9.2.0.tgz#2ed7644a245cddd83d4e087b9b33b3e62dfd10ad" + integrity sha512-/EH/sDgxU2eGxajKdwLCDmQ4FWq+kpi3uCmBGpw1xJtnAxEjlD8j8PEiGWpCIMIs3ciNAgH0d3TTJiUkYzyZjA== + dependencies: + "@jridgewell/trace-mapping" "^0.3.12" + "@types/istanbul-lib-coverage" "^2.0.1" + convert-source-map "^2.0.0" + +validate-npm-package-license@3.0.4, validate-npm-package-license@^3.0.1, validate-npm-package-license@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" + integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== + dependencies: + spdx-correct "^3.0.0" + spdx-expression-parse "^3.0.0" + +validate-npm-package-name@5.0.0, validate-npm-package-name@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/validate-npm-package-name/-/validate-npm-package-name-5.0.0.tgz#f16afd48318e6f90a1ec101377fa0384cfc8c713" + integrity sha512-YuKoXDAhBYxY7SfOKxHBDoSyENFeW5VvIIQp2TGQuit8gpK6MnWaQelBKxso72DoxTZfZdcP3W90LqpSkgPzLQ== + dependencies: + builtins "^5.0.0" + +validate-npm-package-name@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz#5fa912d81eb7d0c74afc140de7317f0ca7df437e" + integrity sha512-M6w37eVCMMouJ9V/sdPGnC5H4uDr73/+xdq0FBLO3TFFX1+7wiUY6Es328NN+y43tmY+doUdN9g9J21vqB7iLw== + dependencies: + builtins "^1.0.3" + +viem@^2.5.0, viem@^2.7.3: + version "2.7.8" + resolved "https://registry.yarnpkg.com/viem/-/viem-2.7.8.tgz#ca60552190cdc501cf4e1d1140d8da7625b1b1f4" + integrity sha512-5r5pkBDBmihCvMx4b3MqtP0FoZCRWE2ML1DssU80+vhJQur0PKd4yHdLbbvoiGGVD6bYiA394juhfdSvXIGgFA== + dependencies: + "@adraffy/ens-normalize" "1.10.0" + "@noble/curves" "1.2.0" + "@noble/hashes" "1.3.2" + "@scure/bip32" "1.3.2" + "@scure/bip39" "1.2.1" + abitype "1.0.0" + isows "1.0.3" + ws "8.13.0" + +vscode-oniguruma@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/vscode-oniguruma/-/vscode-oniguruma-1.7.0.tgz#439bfad8fe71abd7798338d1cd3dc53a8beea94b" + integrity sha512-L9WMGRfrjOhgHSdOYgCt/yRMsXzLDJSL7BPrOZt73gU0iWO4mpqzqQzOz5srxqTvMBaR0XZTSrVWo4j55Rc6cA== + +vscode-textmate@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/vscode-textmate/-/vscode-textmate-8.0.0.tgz#2c7a3b1163ef0441097e0b5d6389cd5504b59e5d" + integrity sha512-AFbieoL7a5LMqcnOF04ji+rpXadgOXnZsxQr//r83kLPr7biP7am3g9zbaZIaBGwBRWeSvoMD4mgPdX3e4NWBg== + +walker@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.8.tgz#bd498db477afe573dc04185f011d3ab8a8d7653f" + integrity sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ== + dependencies: + makeerror "1.0.12" + +wcwidth@^1.0.0, wcwidth@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/wcwidth/-/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8" + integrity sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg== + dependencies: + defaults "^1.0.3" + +web3-utils@^1.3.4: + version "1.10.4" + resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.10.4.tgz#0daee7d6841641655d8b3726baf33b08eda1cbec" + integrity sha512-tsu8FiKJLk2PzhDl9fXbGUWTkkVXYhtTA+SmEFkKft+9BgwLxfCRpU96sWv7ICC8zixBNd3JURVoiR3dUXgP8A== + dependencies: + "@ethereumjs/util" "^8.1.0" + bn.js "^5.2.1" + ethereum-bloom-filters "^1.0.6" + ethereum-cryptography "^2.1.2" + ethjs-unit "0.1.6" + number-to-bn "1.7.0" + randombytes "^2.1.0" + utf8 "3.0.0" + +webidl-conversions@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" + integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== + +whatwg-url@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" + integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== + dependencies: + tr46 "~0.0.3" + webidl-conversions "^3.0.0" + +which-boxed-primitive@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" + integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== + dependencies: + is-bigint "^1.0.1" + is-boolean-object "^1.1.0" + is-number-object "^1.0.4" + is-string "^1.0.5" + is-symbol "^1.0.3" + +which-typed-array@^1.1.13, which-typed-array@^1.1.14: + version "1.1.14" + resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.14.tgz#1f78a111aee1e131ca66164d8bdc3ab062c95a06" + integrity sha512-VnXFiIW8yNn9kIHN88xvZ4yOWchftKDsRJ8fEPacX/wl1lOvBrhsJ/OeJCXq7B0AaijRuqgzSKalJoPk+D8MPg== + dependencies: + available-typed-arrays "^1.0.6" + call-bind "^1.0.5" + for-each "^0.3.3" + gopd "^1.0.1" + has-tostringtag "^1.0.1" + +which@^1.2.10, which@^1.2.14: + version "1.3.1" + resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" + integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== + dependencies: + isexe "^2.0.0" + +which@^2.0.1, which@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + +which@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/which/-/which-3.0.1.tgz#89f1cd0c23f629a8105ffe69b8172791c87b4be1" + integrity sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg== + dependencies: + isexe "^2.0.0" + +wide-align@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.5.tgz#df1d4c206854369ecf3c9a4898f1b23fbd9d15d3" + integrity sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg== + dependencies: + string-width "^1.0.2 || 2 || 3 || 4" + +widest-line@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-3.1.0.tgz#8292333bbf66cb45ff0de1603b136b7ae1496eca" + integrity sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg== + dependencies: + string-width "^4.0.0" + +winston-transport@^4.5.0: + version "4.7.0" + resolved "https://registry.yarnpkg.com/winston-transport/-/winston-transport-4.7.0.tgz#e302e6889e6ccb7f383b926df6936a5b781bd1f0" + integrity sha512-ajBj65K5I7denzer2IYW6+2bNIVqLGDHqDw3Ow8Ohh+vdW+rv4MZ6eiDvHoKhfJFZ2auyN8byXieDDJ96ViONg== + dependencies: + logform "^2.3.2" + readable-stream "^3.6.0" + triple-beam "^1.3.0" + +winston@3.7.2: + version "3.7.2" + resolved "https://registry.yarnpkg.com/winston/-/winston-3.7.2.tgz#95b4eeddbec902b3db1424932ac634f887c400b1" + integrity sha512-QziIqtojHBoyzUOdQvQiar1DH0Xp9nF1A1y7NVy2DGEsz82SBDtOalS0ulTRGVT14xPX3WRWkCsdcJKqNflKng== + dependencies: + "@dabh/diagnostics" "^2.0.2" + async "^3.2.3" + is-stream "^2.0.0" + logform "^2.4.0" + one-time "^1.0.0" + readable-stream "^3.4.0" + safe-stable-stringify "^2.3.1" + stack-trace "0.0.x" + triple-beam "^1.3.0" + winston-transport "^4.5.0" + +wordwrap@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" + integrity sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q== + +workerpool@6.2.1: + version "6.2.1" + resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.2.1.tgz#46fc150c17d826b86a008e5a4508656777e9c343" + integrity sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw== + +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0", wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrap-ansi@^6.0.1: + version "6.2.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" + integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrap-ansi@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" + integrity sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ== + dependencies: + ansi-styles "^6.1.0" + string-width "^5.0.1" + strip-ansi "^7.0.1" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== + +write-file-atomic@5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-5.0.1.tgz#68df4717c55c6fa4281a7860b4c2ba0a6d2b11e7" + integrity sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw== + dependencies: + imurmurhash "^0.1.4" + signal-exit "^4.0.1" + +write-file-atomic@^2.4.2: + version "2.4.3" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.4.3.tgz#1fd2e9ae1df3e75b8d8c367443c692d4ca81f481" + integrity sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ== + dependencies: + graceful-fs "^4.1.11" + imurmurhash "^0.1.4" + signal-exit "^3.0.2" + +write-file-atomic@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-4.0.2.tgz#a9df01ae5b77858a027fd2e80768ee433555fcfd" + integrity sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg== + dependencies: + imurmurhash "^0.1.4" + signal-exit "^3.0.7" + +write-json-file@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/write-json-file/-/write-json-file-3.2.0.tgz#65bbdc9ecd8a1458e15952770ccbadfcff5fe62a" + integrity sha512-3xZqT7Byc2uORAatYiP3DHUUAVEkNOswEWNs9H5KXiicRTvzYzYqKjYc4G7p+8pltvAw641lVByKVtMpf+4sYQ== + dependencies: + detect-indent "^5.0.0" + graceful-fs "^4.1.15" + make-dir "^2.1.0" + pify "^4.0.1" + sort-keys "^2.0.0" + write-file-atomic "^2.4.2" + +write-pkg@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/write-pkg/-/write-pkg-4.0.0.tgz#675cc04ef6c11faacbbc7771b24c0abbf2a20039" + integrity sha512-v2UQ+50TNf2rNHJ8NyWttfm/EJUBWMJcx6ZTYZr6Qp52uuegWw/lBkCtCbnYZEmPRNL61m+u67dAmGxo+HTULA== + dependencies: + sort-keys "^2.0.0" + type-fest "^0.4.1" + write-json-file "^3.2.0" + +ws@7.4.6: + version "7.4.6" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.6.tgz#5654ca8ecdeee47c33a9a4bf6d28e2be2980377c" + integrity sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A== + +ws@8.13.0: + version "8.13.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.13.0.tgz#9a9fb92f93cf41512a0735c8f4dd09b8a1211cd0" + integrity sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA== + +ws@^7.4.6: + version "7.5.9" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.9.tgz#54fa7db29f4c7cec68b1ddd3a89de099942bb591" + integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q== + +xtend@~4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" + integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== + +y18n@^5.0.5: + version "5.0.8" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" + integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== + +yallist@^3.0.2: + version "3.1.1" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" + integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== + +yallist@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" + integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== + +yargs-parser@20.2.4: + version "20.2.4" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.4.tgz#b42890f14566796f85ae8e3a25290d205f154a54" + integrity sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA== + +yargs-parser@21.1.1, yargs-parser@^21.0.1, yargs-parser@^21.1.1: + version "21.1.1" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" + integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== + +yargs-parser@^20.2.2, yargs-parser@^20.2.3: + version "20.2.9" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" + integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== + +yargs-unparser@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-2.0.0.tgz#f131f9226911ae5d9ad38c432fe809366c2325eb" + integrity sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA== + dependencies: + camelcase "^6.0.0" + decamelize "^4.0.0" + flat "^5.0.2" + is-plain-obj "^2.1.0" + +yargs@16.2.0, yargs@^16.0.0, yargs@^16.2.0: + version "16.2.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" + integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== + dependencies: + cliui "^7.0.2" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.0" + y18n "^5.0.5" + yargs-parser "^20.2.2" + +yargs@^17.1.0, yargs@^17.3.1, yargs@^17.6.2, yargs@^17.7.2: + version "17.7.2" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" + integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== + dependencies: + cliui "^8.0.1" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.3" + y18n "^5.0.5" + yargs-parser "^21.1.1" + +yn@3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" + integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== + +yocto-queue@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" + integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== + +zod@^3.22.4: + version "3.22.4" + resolved "https://registry.yarnpkg.com/zod/-/zod-3.22.4.tgz#f31c3a9386f61b1f228af56faa9255e845cf3fff" + integrity sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==